【发布时间】:2011-02-13 06:22:57
【问题描述】:
带有迭代器的代码看起来很像带有指针的代码。迭代器是一些晦涩的类型(例如std::vector<int>::iterator)。
我不明白迭代器和指针是如何相互关联的 - 迭代器是指针的包装器,具有重载操作以前进到相邻元素还是其他什么?
【问题讨论】:
带有迭代器的代码看起来很像带有指针的代码。迭代器是一些晦涩的类型(例如std::vector<int>::iterator)。
我不明白迭代器和指针是如何相互关联的 - 迭代器是指针的包装器,具有重载操作以前进到相邻元素还是其他什么?
【问题讨论】:
迭代器只是一种提供迭代器所需接口的类型——不同类型的迭代器是不同的,在 C++ 标准的第 24.1 节(迭代器要求)中指定。
迭代器的实现方式取决于它们迭代的对象——对于向量,它们通常是指向数组的单个指针的包装器(无论如何在发布版本中),对于更复杂的容器,它们具有更复杂的实现。对于开放式范围,它们将包含用于生成元素的任何算法的状态。
请注意,指向数组中元素的指针满足随机访问迭代器的要求,因此在某种程度上它们是可以互换的。
【讨论】:
迭代器是指针的泛化。
迭代器(取决于变体)必须实现 * 和 ++
所以指针是一个迭代器。但不一定反过来。
如果你想迭代一个复杂的结构(一棵树、一个图......),迭代器将不仅仅是一个指针,并且不会对 ram 中的某个实际位置进行任何引用。
【讨论】:
迭代器是重载某些运算符的对象,因此其用法看起来就像是指针。这在给定迭代器类别的能力范围内。随机访问迭代器看起来完全像指针,其他类型的迭代器不提供某些操作(例如,双向的 list<X>::iterator 没有运算符 += 以及许多其他需要随机访问的操作)。
至于“晦涩的名称”,使用普通指针作为迭代器并非完全不可想象:
template <class T>
class MyContainer
{
...
typedef T* iterator;
}
MyContainer<int>::iterator it; //the type is really int*
【讨论】:
从概念上讲,是的——但它们不必是指针。它们的内部结构和功能将取决于它们“包装”的数据结构。
这就是为什么会有不同的"classes" of iterators。例如。单向、双向、随机存取等
有些可以做多个类。
例如如果内部结构是红黑树或链表,则迭代器可能是双向的,但不是 RandomAccess。如果他们包装一个向量(实现为一个数组),您将拥有 RandomAccess 和 Bidirectional。
【讨论】: