#c #vector #iterator #mergesort
#c #вектор #итератор #сортировка слиянием
Вопрос:
Для назначения класса мне требуется выполнить сортировку вектора слиянием с использованием его итераторов.
Я написал следующее, которое работает с векторами, но не использует итераторы:
void MergeSort(IntVector amp;vec, int left, int right)
{
if (left < right)
{
int nMid = ((left right) / 2);
MergeSort(vec, left, nMid);
MergeSort(vec, nMid 1, right);
//merge(vec, left, nMid, right);
}
}
Я попытался внести некоторые изменения для размещения итераторов, но это не позволяет мне выполнять такие операции, как < и на итераторах.
void MergeSort(IntVectorIt left, IntVectorIt right)
{
if (left < right)
{
intVectorIt nMid = ((left right) / 2);
MergeSort(left, mid);
MergeSort(mid 1, right);
//merge(vec, left, nMid, right);
}
}
Как я могу приспособить использование итераторов в моей сортировке слиянием?
К вашему сведению, это определения типов, которые я использую:
typedef vector<int> IntVector;
typedef IntVector::iterator IntVectorIt;
Комментарии:
1. Будьте осторожны при использовании итераторов, некоторые операции над вектором приведут к аннулированию итераторов и вызовут неопределенное поведение. Смотрите здесь: learningcppisfun.blogspot.com/2007/01 /…
2. к сожалению, профессор настаивает на том, чтобы в нашей сортировке слиянием использовалось слияние STL (algorithms.h), и это слияние работает только с векторами и итераторами.
3. как вы это представляете, я не вижу никаких проблем — вы не можете вставлять / удалять в / из вектора, потому что у вас есть доступ только к двум итераторам, но я просто подумал, что должен вас предупредить.
Ответ №1:
Вы хотите сравнить, совпадают ли итераторы (возможно только условие ошибки при нормальном вводе):
if (left!=right)
Что касается ваших проблем с добавлением, вы думаете об этом неправильно. Семантически добавление left
и right
не имеет смысла, поскольку оно проходит мимо конца вашего массива, не говоря уже о том, что оно переполнится. Все, что вы хотите, это добавить половину расстояния между ними к left
:
IntVectorIt nMid=left (right-left)/2;
Ответ №2:
Вместо left<right
вы должны использовать *left<*right
.
Комментарии:
1. но разве *left не будет приравниваться к значению в векторе, на которое указывает left? Я не хочу проверять значения, но я хочу проверить, находится ли левый итератор слева от правого итератора?
2. @xbonez: Ах, извините, я неправильно истолковал ваш вопрос. В этом случае
left!=right
было бы более уместно.