迭代器和指针如何相关?

带有迭代器的代码看起来非常像带指针的代码。 迭代器是一些模糊的types(例如std::vector<int>::iterator )。

我没有得到的是迭代器和指针是如何相互关联的 – 迭代器是一个包装指针的重载操作,以推进到相邻的元素还是别的东西?

4 Solutions collect form web for “迭代器和指针如何相关?”

迭代器是指针的泛化。

迭代器(取决于变体)必须实现*和++

所以一个指针是一个迭代器。 但不一定是相反的。

如果你想迭代一个复杂的结构(一棵树,一个图…),迭代器将不仅仅是一个指针,而且不会引用RAM中的某个实际位置。

从概念上来说,是的 – 但是他们不需要指点。 他们的内部和function将取决于他们“包装”的数据结构。

这就是为什么迭代器有不同的“类” 。 例如单向,双向,随机访问等

有些能够多个class级。

例如,如果内部结构是红黑树或链接列表,迭代器可能是双向的,但不是随机访问。 如果他们包装一个向量(作为一个数组实现),你将拥有RandomAccess和Bidirectional。

迭代器是重载某些操作符的对象,所以用法看起来像是指针。 这在给定迭代器类别的能力范围内。 随机访问迭代器看起来完全像指针,其他types的迭代器不提供某些操作(例如, list<X>::iterator是双向的,在其他许多需要随机访问的操作符中没有操作符+= )。

至于“晦涩的名字”,对迭代器使用普通指针并不是完全不可能的:

  template <class T> class MyContainer { ... typedef T* iterator; } MyContainer<int>::iterator it; //the type is really int* 

迭代器只是一个提供迭代器所需接口的概念 – 对于不同types的迭代器来说,它们是不同的,并且在C ++标准的第24.1节(迭代器要求)中进行了规定。

如何实现迭代器取决于它们迭代的内容 – 对于向量来说,它们通常是指向数组的单个指针的包装器(在发布版本中),对于更复杂的容器,它们具有更复杂的实现。 对于开放式范围,它们将包含用于生成元素的任何algorithm的状态。

请注意,指向数组元素的指针可以满足随机访问迭代器的要求,因此它们在某种程度上是可以互换的。

  • 为什么一个C ++向量被称为向量?
  • 插入地图的首选/惯用方式
  • 为什么不std :: queue :: pop返回值。
  • 使用函数指针的STL映射
  • 如何更改C ++ STL向量的特定元素
  • 我应该使用哪一个STL容器作为FIFO?
  • 将vector复制到STL列表的最佳方法是什么?
  • 多映射与vector映射的优点是什么?
  • boost是否具有比STL更简单的set操作的数据types?
  • gcc std :: unordered_map实现缓慢吗? 如果是这样 - 为什么?
  • C ++常量映射元素访问