反向遍历:迭代器或反向迭代器:正确性和偏好?
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 可在以下位置找到:
- How do you erase AND CONTINUE using a std::reverse_iterator?
- Dr. Dobbs article
- "What are the shortcomings of std::reverse_iterator?"
foo.begin()-1
产生未定义的行为,所以不,这不是一个好主意。
鉴于您正在做的完全反向迭代器旨在完成的任务,这似乎是显而易见的做事方式。反向迭代器当然有限制,但在许多情况下(包括您在上面概述的情况)它们根本无关紧要。
顺便说一句,你的第二个循环基本上等同于:
std::for_each(foo.rbegin(), r.rend(), DoSomethinghere);
除了 for_each
将传递迭代器指向的项而不是迭代器本身的(通常不相关的)细节。
我可以像下面这样使用迭代器反向遍历吗(正确吗?):
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 可在以下位置找到:
- How do you erase AND CONTINUE using a std::reverse_iterator?
- Dr. Dobbs article
- "What are the shortcomings of std::reverse_iterator?"
foo.begin()-1
产生未定义的行为,所以不,这不是一个好主意。
鉴于您正在做的完全反向迭代器旨在完成的任务,这似乎是显而易见的做事方式。反向迭代器当然有限制,但在许多情况下(包括您在上面概述的情况)它们根本无关紧要。
顺便说一句,你的第二个循环基本上等同于:
std::for_each(foo.rbegin(), r.rend(), DoSomethinghere);
除了 for_each
将传递迭代器指向的项而不是迭代器本身的(通常不相关的)细节。