Uzyskaj odwrotny iterator z iteratora do przodu bez znajomości typu wartości

Usiłuję zaimplementować niektóre algorytmy sortowania w stylu STL. Prototyp dlastd::sort wygląda na coś takiego (zcplusplus.com):

template <class RandomAccessIterator>
void sort ( RandomAccessIterator first, RandomAccessIterator last );

Funkcja jest ogólnie nazywana w ten sposób (chociaż typ kontenera może się różnić):

std::vector<int> myVec;
// Populate myVec
std::sort(myVec.begin(), myVec.end());

Powieliłem prototypstd::sort dla mojej własnej funkcji sortowania. Aby przejść przez kontener do sortowania, wykonuję następujące czynności:

template <class RandomAccessIterator>
void mySort(RandomAccessIterator first, RandomAccessIterator last) {  
  RandomAccessIterator iter;
  for (iter = first; iter != last; ++iter) {
    // Do stuff
  }
}

Wystarczająco łatwe. Ale co, jeśli chcę użyć odwrotnego iteratora? Byłoby to wygodne w algorytmach sortujących pojemnik z obu końców, np.rodzaj koktajlu.

Czy jest jakiś sposób na uzyskanie odwrotnego iteratora z iteratorów, które są przekazywane jako parametry? Gdybym znał wcześniej typ kontenera, mógłbym zrobić coś takiego:

template <class RandomAccessIterator>
void mySort(RandomAccessIterator first, RandomAccessIterator last) {
  std::vector<int>::reverse_iterator riter(last);
  std::vector<int>::reverse_iterator rend(first);
  for ( ; riter != rend; ++riter) {
    // Do stuff
  }
}    

Niestety, Janie znać typ kontenera. To, co naprawdę muszę zrobić, to coś takiego:

template <class RandomAccessIterator>
void mySort(RandomAccessIterator first, RandomAccessIterator last) {
  RandomAccessIterator riter = reverse_iterator(last);
  RandomAccessIterator rend = reverse_iterator(begin);
  for ( ; riter != rend; ++riter) {
    // Do stuff
  }
}

Czy jest jakiś sposób, aby to zrobić bez konieczności przekazywania odwrotnych iteratorów jako dodatkowych parametrów (co rozwiąże problem, ale uczyni prototyp funkcji mniej intuicyjnym)?

Zauważ, że potrzebuję obu do przodui odwrotne iteratory w mojej implementacji, więc wywołanie funkcji w ten sposób

std::vector<int> myVec;
// Populate myVec
mySort(myVec.rbegin(), myVec.rend());

nie będzie działać.

questionAnswers(1)

yourAnswerToTheQuestion