使用迭代器的代码看起来非常像带有指针的代码。迭代器是一些模糊的类型(例如std::vector<int>::iterator
)。
我没有得到的是迭代器和指针是如何相互关联的 - 迭代器是指针周围的包装器,带有重载操作以前进到相邻元素,还是其他东西?
答案 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节(迭代器要求)中指定。
如何实现迭代器取决于它们迭代的内容 - 对于向量,它们通常是指向数组的单个指针的包装器(无论如何在发布版本中),对于更复杂的容器,它们具有更复杂的实现。对于开放式范围,它们将包含用于生成元素的任何算法的状态。
请注意,指向数组中元素的指针符合随机访问迭代器的要求,因此在某种程度上它们是可互换的。