STL 算法的反向迭代

Posted

技术标签:

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

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

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

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

【问题讨论】:

遗憾的是,我只是提供一个函数,供我正在使用的一些讨厌的代码调用。 我错过了表明它是普通数组的点,并且已经有解决方案所以我删除了我的评论。 【参考方案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 中。

以上是关于STL 算法的反向迭代的主要内容,如果未能解决你的问题,请参考以下文章

c++stl之反向迭代器用法及注意事项!!!

反向迭代器

反向迭代器

C++ STL list迭代器

C++ STL应用与实现18: 如何使用迭代器适配器

神经网络算法推演---------神经网络中的反向传播算法公式推导及迭代演示