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

时间:2010-04-28 09:26:57

标签: c++ stl pointers iterator

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

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

4 个答案:

答案 0 :(得分:50)

迭代器是指针的推广。

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

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

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

答案 1 :(得分:9)

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

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

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

 MyContainer<int>::iterator it; //the type is really int*

答案 2 :(得分:7)

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

这就是为什么有不同的"classes" of iterators。例如。单向,双向,随机访问等

有些人能够多班。

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

答案 3 :(得分:4)

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

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

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