在数组索引上使用迭代器

时间:2010-03-25 12:45:42

标签: c++

我只是想知道在数组索引上使用迭代器的主要优点是什么。我用谷歌搜索,但我得不到正确答案。

9 个答案:

答案 0 :(得分:14)

我认为你在谈论使用矢量时,对吧?

主要优点是迭代器代码适用于所有stl容器,而数组索引操作符[]仅适用于矢量和deques。这意味着如果需要,您可以自由更改基础容器,而无需重新编码每个循环。它还意味着您可以将迭代代码放在模板中,它可以用于任何容器,而不仅仅是deques和矢量(当然还有数组)。

答案 1 :(得分:6)

所有标准容器都提供迭代器概念。迭代器知道如何在容器中查找下一个元素,尤其是当底层结构不像数组时。每个容器都不提供数组样式operator[],因此不管您选择哪个容器,养成使用迭代器的习惯都会使代码看起来更加一致。

答案 2 :(得分:3)

您可以抽象出集合实现。

答案 3 :(得分:2)

有许多数据结构,例如哈希表和链表不能自然或快速索引,但它们确实是可遍历的。迭代器充当一个接口,让您可以在不知道源的实际实现的情况下遍历任何数据结构。

答案 4 :(得分:2)

扩展之前的答案:

  1. 使用operator []编写循环会将您限制为支持[]并使用相同索引/大小类型的容器。否则,您需要重写每个循环以更改容器。

  2. 即使您的容器支持[],它也可能不是顺序遍历的最佳选择。 []基本上是一个随机访问运算符,它对于向量是O(1),但可能与O(n)一样糟糕,具体取决于底层容器。

  3. 这是一个小问题,但是如果你使用迭代器,你的循环可以更容易地转移到使用标准算法,例如的std ::的for_each。

答案 5 :(得分:2)

STL包含对容器进行操作的算法,例如transformfor_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)

我想说这更多的是一致性和代码重用问题。

  • 一致性,您将使用带迭代器的所有其他容器
  • 代码重用,为迭代器编写的算法不能与下标运算符一起使用,反之亦然...而且STL有很多算法,所以你肯定想要在它上构建。

最后,我想说即使C数组也有迭代器。

const Foo* someArray = //...
const Foo* otherArray = new Foo[someArrayLength];

std::copy(someArray, someArray + someArrayLength, otherArray);

iterator_traits类已被专门化,因此指针或RandomAccessIterator的模型。