从头到尾迭代 C 向量

新手上路,请多包涵

是否可以从头到尾迭代一个向量?

 for (vector<my_class>::iterator i = my_vector.end();
        i != my_vector.begin(); /* ?! */ ) {
}

或者只有这样的事情才有可能:

 for (int i = my_vector.size() - 1; i >= 0; --i) {
}

原文由 user 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 642
2 个回答

一种方法是:

 for (vector<my_class>::reverse_iterator i = my_vector.rbegin();
        i != my_vector.rend(); ++i ) {
}

rbegin() / rend() 专为此目的而设计。 (是的,增加 reverse_interator 将其向后移动。)

Now, in theory, your method (using begin() / end() & --i ) would work, std::vector ’s iterator being bidirectional, but请记住, end() 不是最后一个元素——它是最后一个元素之外的元素,所以你必须先递减,当你到达 begin() 时你就完成了——但你仍然必须做你的处理。

 vector<my_class>::iterator i = my_vector.end();
while (i != my_vector.begin())
{
     --i;
    /*do stuff */

}

更新:在将 for() while() 时,我显然过于激进了。 (重要的部分是 --i 在开头。)

原文由 James Curran 发布,翻译遵循 CC BY-SA 4.0 许可协议

如果您可以使用 Boost 库,则 Boost.Range 提供 reverse 范围适配器,包括:

 #include <boost/range/adaptor/reversed.hpp>

然后,结合 C++11 的 for loop ,您可以编写以下内容:

 for (auto& elem: boost::adaptors::reverse(my_vector)) {
   // ...
}

由于此代码比使用迭代器对的代码更简洁,因此它可能更具可读性且不易出错,因为需要注意的细节较少。

原文由 JFMR 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题