【问题标题】:Are Iterators faster than array[i]? [duplicate]迭代器比数组 [i] 快吗? [复制]
【发布时间】:2011-09-05 14:06:32
【问题描述】:

可能重复:
Why use iterators instead of array indices?

因为在我的一生中,我无法弄清楚它们如何不是多余的。

vector<string>::iterator iter1
vector<string>::const_iterator iter2

也许他们更快?

【问题讨论】:

  • 在您关心的上下文中衡量是唯一有效的答案。
  • 根据实际容器,递增迭代器可能比索引更快(想想链表)。真正的原因是六字母变量在他的回答中写的。
  • @Tamás: ... 和其他两个回答者一起。
  • @Alexandre:糟糕,我对副本的搜索显然很糟糕。查看 RHS 上的 Related 表明我是个白痴 :)
  • @Tomalak Geret'kal 我写评论时没有其他答案,但是是的。

标签: c++ arrays iterator arrayiterator


【解决方案1】:

迭代器允许开发独立于容器的算法。这样std::sort 之类的东西就不必关心它是vector 还是your_datastructure_here,只要它满足适当的迭代器要求即可。

考虑在listvector 或裸数组中找到最大值。

int A[...];         // ...some array
std::list<int> L;   // ...some list
std::vector<int> V; // ...some vector

int* maxA                       = std::max_element(A, A + 10);
std::list<int>::iterator maxL   = std::max_element(L.begin(), L.end());
std::vector<int>::iterator maxV = std::max_element(V.begin(), V.end());

【讨论】:

    【解决方案2】:

    它们推广到 array[i] 慢得多的其他集合(即列表)甚至不可能(记录集)。

    此外,STL 算法也使用它们。 STL 算法旨在处理任何可迭代的集合 - 为什么要排除向量?

    存在两个迭代器 - 一个 const 而另一个不是 - 是由 const 引用在 C++ 中的工作方式引起的。如果你只有一个 const 对向量的引用,为什么你应该能够改变里面的东西?因此const_iterator。常规的iterator 返回一个元素的可写引用。

    【讨论】:

    • .. 现在是 C++ 标准算法,这是 OP 实际使用的。
    【解决方案3】:

    迭代器是一个通用概念。它们适用于各种容器并具有相似的界面。

    arr_int[i] 这样直接访问数组元素肯定更快,因为它直接转换为指针运算。

    【讨论】:

    • 通常std::vector 的迭代器只是简单地包装一个指针(在某些实现中,它们甚至可能是 be 指针),因此,在优化阶段之后,即使在这种情况下你只是做指针运算。
    • 显然我没有考虑太多就发表了评论,这有点像重点。它值得一票否决。对不起各位!
    【解决方案4】:

    迭代器并不是为了更快,而是为了尽可能快,而且更通用。 array[i] 仅对数组有效,对链表无效。

    【讨论】:

    • 这就是它的意义所在。谢谢!
    【解决方案5】:

    在通过向量“随机访问”的简单情况下?没有。

    事实上,您的向量迭代器可能是根据数组访问来定义的,并且将完全一样快。

    您获得的是在泛型编程中使用它们的能力。您可能并不总是使用向量,而且并非所有容器都支持随机访问。

    使用迭代器不仅是为了保持一致性,而且是为了利用模板元编程的能力,这种一致性为您提供了。

    而且,如果没有别的,它们是一种安全且有用的抽象。

    【讨论】:

      猜你喜欢
      • 2012-07-22
      • 2013-09-27
      • 2012-01-13
      • 2015-02-27
      • 2017-07-05
      • 2010-11-07
      • 2020-04-10
      • 1970-01-01
      • 2012-01-31
      相关资源
      最近更新 更多