迭代器和指针有什么关系?

sha*_*oth 35 c++ pointers iterator stl

使用迭代器的代码看起来非常像带指针的代码.迭代器是一些模糊的类型(std::vector<int>::iterator例如).

我没有得到的是迭代器和指针是如何相互关联的 - 迭代器是指针周围的包装器,带有重载操作以前进到相邻元素,还是其他什么?

Tri*_*ner 51

迭代器是指针的推广.

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

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

如果你想迭代一个复杂的结构(一个树,一个图......),迭代器将不仅仅是一个指针,并且不会对ram中的某个实际位置进行任何引用.

  • 我们可以说指针是迭代器的子集吗? (8认同)
  • 是的,绝对的 (8认同)
  • @dekuShrub,_如果迭代器不仅仅是指针,那么指针肯定不能是迭代器_。迭代器**不**(必然)不仅仅是一个指针,它**可以**不仅仅是一个指针。最初的短语是_**如果**你想要...,**[那么]**迭代器将不仅仅是一个指针_。所以在某些特定情况下它不仅仅是指针。有不同的迭代器。其中一些(例如,`std::vector`的迭代器)几乎是指针,其中一些(例如,`std::map`的迭代器)更复杂。指针只是迭代器最简单的例子。 (4认同)
  • 例如,图节点上的迭代器可以是深度优先或广度优先。因此迭代器需要知道它在图中的位置才能检索节点。所以迭代器是一个结构体,有属性和一切。它不仅仅是一个内存地址 (3认同)
  • 这个答案没有矛盾吗?如果迭代器不仅仅是一个指针,那么指针肯定不能是迭代器吗? (2认同)

Unc*_*ens 9

迭代器是重载某些运算符的对象,因此使用看起来像是指针.这属于给定迭代器类别的功能.随机访问迭代器看起来完全像指针,其他类型的迭代器不提供某些操作(例如list<X>::iterator,哪些是双向的,+=在许多其他需要随机访问的操作符中没有操作符).

至于"晦涩的名字",使用普通指针作为迭代器并不是完全不可想象的:

 template <class T>
 class MyContainer
 {
     ...
     typedef T* iterator;
 }

 MyContainer<int>::iterator it; //the type is really int*
Run Code Online (Sandbox Code Playgroud)


Ale*_*ski 7

从概念上讲,是的 - 但它们不一定是指针.它们的内部和功能将取决于它们"包装"的数据结构.

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

有些人能够多班.

例如,如果内部结构是红黑树或链接列表,则迭代器可能是双向的,但不是RandomAccess.如果它们包装一个向量(实现为数组),您将拥有RandomAccess和Bidirectional.


Joe*_*oeG 5

迭代器只是一种提供迭代器所需接口的类型 - 这些对于不同类型的迭代器是不同的,并且在 C++ 标准的第 24.1 节(迭代器要求)中指定。

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

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

  • 我认为这个词是*概念*而不是*类型*。 (2认同)