使用迭代器和索引访问向量元素有什么区别?

时间:2009-05-28 06:11:13

标签: c++ vector iterator

使用迭代器与索引访问向量元素有什么好处?

4 个答案:

答案 0 :(得分:8)

为什么迭代器比索引更好?

  • 在索引不可用的情况下(比如std :: list,for 例子)。
  • 在接受迭代器的泛型函数的情况下 被称为。
  • 编写应该使用的函数模板时 不止一种容器类型。
  • 它们的存在是为了在所有容器和使用能力之间创建一致性 所有容器的迭代器以及所有标准的常规指针 算法。
  • 迭代器可以指向除了作为概念之外不存在的序列。 例如,您可以创建一个遍历prime的迭代器类 没有实际构建素数容器的数字。

但是,如果忽略不支持随机访问的容器类型(列表,设置等),迭代器仍会提供

  • 像语义一样的指针(想想string :: iterator与char *)。
  • 广义概念可用于迭代之外的元素 容器
  • 在少数情况下,性能优于容器成员函数。

答案 1 :(得分:4)

模块化就是答案。假设你将逻辑包装在一个函数调用中(一个好的做法)。在这种情况下,使它接收迭代器将使它成为通用的,这样它就可以在C样式数组(指针),C ++ stl向量或任何真正表现得像迭代器容器的东西上运行,例如链接列表。

答案 2 :(得分:3)

我说它跨容器的可移植性。

如果使用向量编写代码并使用索引进行迭代,则以后不能轻易地将代码更改为其他容器。

typedef std::vector<int> myContainer; //only change here for std::list 

for ( myContainer::iterator iter = actualContainer.begin();
      iter != actualContainer.end(); 
      ++iter)
{}

在上面的代码中,如果要从向量更改为列表,则很容易实现。如果您使用过该索引,那么就无法实现。

否则,因为向量使用随机访问迭代器,所以它应该是相同的。 (索引或迭代器一切正常)

答案 3 :(得分:1)

最近我问了这个问题的性能问题。 你可能想看看我得到的答案。

检查以下链接:Iterators vs. indexes

讨论主要是关于性能,结果是平台相关的,每个平台都有微小的变化。