以下面两行代码为例:

for (int i = 0; i < some_vector.size(); i++)
{
    //do stuff
}

这:

for (some_iterator = some_vector.begin(); some_iterator != some_vector.end();
    some_iterator++)
{
    //do stuff
}

有人告诉我第二种方法更可取。为什么会这样呢?


当前回答

因为它更面向对象。如果你用一个索引迭代,你假设:

A)这些对象是有序的 B)这些对象可以通过索引获得 C)索引增量会影响每一项 D,指数从零开始

使用迭代器,你是在说“给我所有东西,这样我就可以使用它”,而不知道底层实现是什么。(在Java中,有些集合不能通过索引访问)

此外,使用迭代器,无需担心超出数组的边界。

其他回答

比“告诉CPU做什么”(命令式)更好的是“告诉库你想要什么”(函数式)。

因此,你应该学习stl中的算法,而不是使用循环。

容器独立性

如果你喜欢接近金属/不相信它们的实现细节,就不要使用迭代器。 如果在开发过程中经常从一种集合类型切换到另一种集合类型,请使用迭代器。 如果您发现很难记住如何迭代不同类型的集合(可能您使用了来自几个不同外部源的几种类型),请使用迭代器来统一遍历元素的方法。这适用于切换一个链表和一个数组列表。

真的,就是这样。这并不是说您要获得更多的简洁,如果简洁确实是您的目标,您总是可以求助于宏。

STL迭代器大部分都在那里,所以STL算法,比如sort,可以是容器独立的。

如果你只是想循环遍历一个向量中的所有项,只需使用索引循环样式。

对大多数人来说,它的输入更少,更容易解析。如果c++有一个简单的foreach循环,而不是过度使用模板魔法,那就太好了。

for( size_t i = 0; i < some_vector.size(); ++i )
{
   T& rT = some_vector[i];
   // now do something with rT
}
'

我不认为这对向量有多大区别。我更喜欢自己使用索引,因为我认为它更具可读性,你可以做随机访问,如向前跳转6个项目或向后跳转,如果需要的话。

我还喜欢像这样引用循环内的项目,这样在位置周围就不会有很多方括号:

for(size_t i = 0; i < myvector.size(); i++)
{
    MyClass &item = myvector[i];

    // Do stuff to "item".
}

使用迭代器可以很好,如果你认为你可能需要在未来的某个时候用一个列表替换向量,它也看起来更时尚的STL怪胎,但我想不出任何其他原因。