MergeSort вектор с использованием итераторов - PullRequest
0 голосов
/ 19 апреля 2011

Для присвоения класса мне необходимо объединить вектор с использованием его итераторов.

Я написал следующее, что работает с векторами, но не использует итераторы:

void MergeSort(IntVector &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);
     }
}

Iпопытался внести некоторые изменения, чтобы приспособить итераторы, но он не позволяет мне выполнять такие операции, как <и + на итераторах. </p>

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:

typedef vector<int> IntVector;
typedef IntVector::iterator IntVectorIt;

Ответы [ 2 ]

3 голосов
/ 19 апреля 2011

Вы хотите сравнить, если итераторы одинаковы (возможны только условия ошибки с вменяемым вводом):

 if (left!=right)

Что касается ваших дополнительных сложностей, вы думаете, что это неправильно. Семантическое добавление left и right не имеет смысла, поскольку оно проходит за конец вашего массива, не говоря уже о том, что оно переполнится. Вы хотите добавить половину расстояния между ними к left:

IntVectorIt nMid=left+(right-left)/2;
1 голос
/ 19 апреля 2011

Вместо left<right, вы должны использовать *left<*right.

...