我正在尝试实现一些STL风格的排序算法。的原型
std::sort
看起来像这样(从
cplusplus.com
):
template <class RandomAccessIterator>
void sort ( RandomAccessIterator first, RandomAccessIterator last );
通常这样调用函数(尽管容器类型可能不同):
std::vector<int> myVec;
// Populate myVec
std::sort(myVec.begin(), myVec.end());
我复制了
STD::排序
我自己的排序功能。要遍历要排序的容器,我执行以下操作:
template <class RandomAccessIterator>
void mySort(RandomAccessIterator first, RandomAccessIterator last) {
RandomAccessIterator iter;
for (iter = first; iter != last; ++iter) {
// Do stuff
}
}
很简单。但是如果我想使用反向迭代器呢?这在从两端对容器进行排序的算法中很方便,例如
cocktail sort
.
有没有办法从作为参数传入的迭代器中获取反向迭代器?如果我事先知道集装箱类型,我可以这样做:
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
}
}
不幸的是,我
不要
了解容器类型。我真正需要做的是这样的事情:
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
}
}
有没有什么方法可以做到这一点而不必将反向迭代器作为附加参数传递(这可以解决问题,但会降低函数原型的直观性)?
注意我需要两个都向前
和
在我的实现中反转迭代器,因此用这种方式调用函数
std::vector<int> myVec;
// Populate myVec
mySort(myVec.rbegin(), myVec.rend());
不会起作用。