【问题标题】:C++ reverse_iterator AlternativesC++ reverse_iterator 替代方案
【发布时间】:2010-11-20 07:14:47
【问题描述】:

我正在尝试编写包含一些遗留代码的两遍算法。我想通过一个特定的容器两次,一次是按顺序,一次是相反的顺序。显然,我的第一个想法是使用iteratorreverse_iterator,但奇怪的是,我正在使用的容器类的设计者认为不适合为容器定义一个工作reverse_iteratorreverse_iterators 这里不能可以像iterators 一样取消引用)。我已经有一个需要reverse_iterator 的算法。

我的想法是在算法的第一部分使用第一次遍历迭代器,当我执行算法push_front 时,将项目放入一个新容器中,然后遍历新容器。这将占用内存,这在我的应用程序中并不重要,但让我想知道:在 C++ 中是否有任何更清洁的替代品来替代 reverse_iterators,或者我应该花时间仅使用转发 iterators 来重新设计我的算法吗?

【问题讨论】:

    标签: c++ algorithm stl iterator


    【解决方案1】:

    如果您需要以相反的顺序迭代容器的元素,则不一定需要使用反向迭代器。

    如果容器有双向迭代器,那么你可以使用普通的迭代器,使用--itend()迭代到begin(),而不是使用++itbegin()迭代到end()

    由于这有点棘手,您可以使用 std::reverse_iterator 包装器将普通迭代器转换为反向迭代器(这基本上交换了 ++-- 并封装了使其工作所需的技巧)。

    如果容器没有双向迭代器,那么这意味着不可能以相反的顺序迭代容器的元素,在这种情况下,您需要重写算法或使用不同的容器。

    任何具有双向迭代器的容器,它应该提供反向迭代器功能;这是 STL 和 C++ 标准库“容器”概念的一部分。

    【讨论】:

    • 谢谢,看起来迭代器是双向的。该类实际上使用std::reverse_iterator 来实现它的reverse_iterator,但是当我尝试使用它并取消引用它时,我得到一个编译器错误。
    • @Zeke:您必须发布您正在使用的代码以及确切的编译器错误;否则,很难提供帮助。 :(
    • @James:很公平。我想我的 --it 想法可行,但是您对 for 循环条件有什么建议吗?我想使用for (--it; it != end; --it),但我会错过最后一项。我可以修改条件还是需要在循环体结束后包含循环代码?
    • @James:在上面的代码中,it 设置为.end()end 设置为.begin()
    • @Zeke:这是 std::reverse_iterator 模板帮助解决的棘手部分。 :-) 无论如何,你需要for (auto loop_it = end(); loop_it != begin(); --loop_it) { auto it = loop_it; --it; } 实际上,你从end()begin() 的迭代器但是在循环内部你使用迭代器指向的元素之前的元素;如果你在纸上画出这个方法,它会比我在评论中解释的更有意义:-P(用你的迭代器类型替换auto
    猜你喜欢
    • 1970-01-01
    • 2011-03-20
    • 2014-02-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-06
    • 2011-08-24
    相关资源
    最近更新 更多