我只是想知道在数组索引上使用迭代器的主要优点是什么。我用谷歌搜索,但我得不到正确答案。
答案 0 :(得分:14)
我认为你在谈论使用矢量时,对吧?
主要优点是迭代器代码适用于所有stl容器,而数组索引操作符[]
仅适用于矢量和deques。这意味着如果需要,您可以自由更改基础容器,而无需重新编码每个循环。它还意味着您可以将迭代代码放在模板中,它可以用于任何容器,而不仅仅是deques和矢量(当然还有数组)。
答案 1 :(得分:6)
所有标准容器都提供迭代器概念。迭代器知道如何在容器中查找下一个元素,尤其是当底层结构不像数组时。每个容器都不提供数组样式operator[]
,因此不管您选择哪个容器,养成使用迭代器的习惯都会使代码看起来更加一致。
答案 2 :(得分:3)
您可以抽象出集合实现。
答案 3 :(得分:2)
有许多数据结构,例如哈希表和链表不能自然或快速索引,但它们确实是可遍历的。迭代器充当一个接口,让您可以在不知道源的实际实现的情况下遍历任何数据结构。
答案 4 :(得分:2)
扩展之前的答案:
使用operator []编写循环会将您限制为支持[]并使用相同索引/大小类型的容器。否则,您需要重写每个循环以更改容器。
即使您的容器支持[],它也可能不是顺序遍历的最佳选择。 []基本上是一个随机访问运算符,它对于向量是O(1),但可能与O(n)一样糟糕,具体取决于底层容器。
这是一个小问题,但是如果你使用迭代器,你的循环可以更容易地转移到使用标准算法,例如的std ::的for_each。
答案 5 :(得分:2)
STL包含对容器进行操作的算法,例如transform
和for_each
。它们不接受索引,但使用迭代器。
迭代器有助于隐藏容器实现,并允许程序员更多地关注算法。 for_each
函数可以应用于任何支持前向迭代器的函数。
答案 6 :(得分:1)
除了其他答案中的要点之外,迭代器也可以更快(特别是与operator[]
比较),因为它们本质上是指针迭代。如果您执行以下操作:
for (int i = 0; i < 10; ++i)
{
my_vector[i].DoSomething();
}
循环的每次迭代都会不必要地计算my_vector.begin() + i
。如果使用迭代器,则递增迭代器意味着它已经指向下一个元素,因此您不需要额外的计算。这是一件小事,但可以在紧密循环中发挥作用。
答案 7 :(得分:1)
另一个细微的区别是你不能通过索引对vector中的元素使用erase(),你必须有一个迭代器。没什么大不了的,因为你可以随时使用“vect.begin()+ index”作为迭代器,但还有其他注意事项。例如,如果执行此操作,则必须始终根据size()检查索引,而不是为该值指定的某个变量。
这些都不值得担心,但如果给出了选择,我更喜欢迭代器访问,原因已经说明了这一点。
答案 8 :(得分:1)
我想说这更多的是一致性和代码重用问题。
最后,我想说即使C
数组也有迭代器。
const Foo* someArray = //...
const Foo* otherArray = new Foo[someArrayLength];
std::copy(someArray, someArray + someArrayLength, otherArray);
iterator_traits
类已被专门化,因此指针或RandomAccessIterator
的模型。