反向遍历:迭代器或反向迭代器:正确性和偏好?

时间:2015-03-27 03:03:30

标签: c++ iterator

我可以使用下面的迭代器来反转遍历(它是否正确?):

for (auto it=foo.end()-1; it != foo.begin()-1; it--)
    DoSomethingHere(it);

我一直在向量上做这个。但是,从Dr. Dobbs article开始,迭代器实现似乎可能会有所不同。我担心它会在其他类的迭代器上失败。

如果上述实现是正确的,是首选还是首选的反向迭代器:

for (auto it = foo.rbegin(); it != foo.rend(); it++)
        DoSomethingHere(it);

此优惠问题的相关文章/ Q& A可在以下网址找到:

  1. How do you erase AND CONTINUE using a std::reverse_iterator?
  2. Dr. Dobbs article
  3. "What are the shortcomings of std::reverse_iterator?"

1 个答案:

答案 0 :(得分:1)

foo.begin()-1产生未定义的行为,所以不,这不是一个好主意。

鉴于你正在做完全反向迭代器的设计目的,这似乎是明显的做事方式。反向迭代器肯定存在局限性,但对于许多情况(包括上面概述的内容),它们只是无关紧要。

顺便说一下,你的第二个循环基本上等同于:

std::for_each(foo.rbegin(), r.rend(), DoSomethinghere);

除了({1}}将传递迭代器指向的项的(通常不相关的)细节,而不是迭代器本身。