从前向迭代器获取反向迭代器而不知道值类型

时间:2009-11-24 01:49:06

标签: c++ sorting iterator

我正在尝试实现一些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());

无效。

2 个答案:

答案 0 :(得分:29)

STL有std::reverse_iterator<Iterator>

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

important note

  

但请注意,当迭代器时   反转,反转版本   没有指向相同的元素   范围,但前面的那个。   就是这样,为了安排   范围的过去元素:   一个指向过去的迭代器   一个范围内的元素,当反转时,是   改为指向最后一个元素   范围(不会超过它)(这会   如果是该范围的第一个元素   相反)。如果是一个迭代器   范围中的第一个元素是相反的,   反转的迭代器指向   第一个元素之前的元素(这个   将是过去的结局元素   范围如果逆转)。

答案 1 :(得分:-5)

查看reverse_iterator的base()方法。