【发布时间】:2010-12-19 17:26:42
【问题描述】:
我正在尝试实现一些 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::sort 的原型。要遍历要排序的容器,我执行以下操作:
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());
不会工作。
【问题讨论】: