【问题标题】:Reverse Iteration of an STL AlgorithmSTL 算法的反向迭代
【发布时间】:2014-05-07 11:18:57
【问题描述】:

我有一个函数,它使用 2 个参数指针调用,即数组的开头和结尾。我的函数将从结束指针到开始指针搜索匹配条件的元素。

如果我尝试向前迭代,我可以使用find_if 来执行此操作,但我需要反向迭代。 STL 对此有任何规定吗?

注意:我可以在 for 循环中轻松完成此操作。我正在寻找的是一个更优雅的解决方案。

【问题讨论】:

  • 遗憾的是,我只是提供一个函数,供我正在使用的一些讨厌的代码调用。
  • 我错过了表明它是普通数组的点,并且已经有解决方案所以我删除了我的评论。

标签: c++ stl reverse-iterator


【解决方案1】:

是的,它被称为std::reverse_iterator。一个例子:

template<typename RandomAccessIterator>
void reverse_sort(RandomAccessIterator begin, RandomAccessIterator end) {
    typedef std::reverse_iterator<RandomAccessIterator> r_iter_t;
    std::sort(r_iter_t(end), r_iter_t(begin));
}

int main() {
    int arr[] = { 1, 2, 3 };
    reverse_sort(std::begin(arr), std::end(arr));
    for(auto i : arr) std::cout << i << "\n";
}

给予

3
2
1

【讨论】:

  • std::beginstd::end 不适用于函数参数。它们仅适用于本地声明的固定大小的数组指针。
  • @JonathanMee begin/end 可以处理很多事情,包括通过引用传递给您的函数的数组,但这不是重点。您有一个开始和结束迭代器,只需将它们传递到我传递开始和结束迭代器的地方。 如何获得它们实际上并不重要。
  • @JonathanMee 我已经重写了这个例子,所以你可以看到为什么std::begin/std::end 对解决方案的可行性没有任何影响
  • 您可以使用std::make_reverse_iterator自动进行类型推断。
  • @C.R.最后。我不知道这已被添加到 C++1y 中。
猜你喜欢
  • 2021-12-24
  • 1970-01-01
  • 2020-11-06
  • 2016-10-11
  • 1970-01-01
  • 1970-01-01
  • 2014-09-15
  • 1970-01-01
  • 2016-03-15
相关资源
最近更新 更多