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

reverse traversal: iterator or reverse iterator: correctness and preference?

我可以像下面这样使用迭代器反向遍历吗(正确吗?):

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);

此偏好问题的相关 articles/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?"

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

鉴于您正在做的完全反向迭代器旨在完成的任务,这似乎是显而易见的做事方式。反向迭代器当然有限制,但在许多情况下(包括您在上面概述的情况)它们根本无关紧要。

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

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

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