2010-04-28 65 views
26

带迭代器的代码看起来非常像带指针的代码。迭代器是一些不明显的类型(例如std::vector<int>::iterator)。迭代器和指针如何相关?

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

回答

44

迭代器是指针的泛化。

迭代器(取决于变体)具有与实施*和++

因此,一个指针是一个迭代。但不一定是相反的。

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

+7

我们可以说指针是迭代器的子集吗? – solti 2014-09-11 22:37:03

+7

是的,绝对的 – 2014-09-12 09:44:37

7

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

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

一些能够多个类。

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

7

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

至于“晦涩名称”时,它是不能完全不可想象使用一个普通的指针为一个迭代:

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

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

迭代器就是提供用于迭代所需的接口的一个概念 - 这些都是不同用于不同类型的迭代器,并在C++标准的第24.1节(迭代器要求)中进行了规定。

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

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

+2

我认为这个词是* concept *而不是* type *在这里。 – 2010-04-28 10:14:36