带迭代器的代码看起来非常像带指针的代码。迭代器是一些不明显的类型(例如std::vector<int>::iterator
)。迭代器和指针如何相关?
我没有得到的是迭代器和指针是如何相互关联的 - 迭代器是一个包装指针的重载操作的指针,以推进到相邻元素还是其他东西?
带迭代器的代码看起来非常像带指针的代码。迭代器是一些不明显的类型(例如std::vector<int>::iterator
)。迭代器和指针如何相关?
我没有得到的是迭代器和指针是如何相互关联的 - 迭代器是一个包装指针的重载操作的指针,以推进到相邻元素还是其他东西?
迭代器是指针的泛化。
迭代器(取决于变体)具有与实施*和++
因此,一个指针是一个迭代。但不一定是相反的。
如果你想迭代一个复杂的结构(一棵树,一个图...),迭代器将远不止一个指针,并且不会引用RAM中的某个实际位置。
概念上,是的 - 但它们不需要是指针。他们的内部和功能将取决于他们“包装”的数据结构。
这就是为什么有不同的"classes" of iterators。例如。单向,双向,随机访问等。
一些能够多个类。
E.g.如果内部结构是红黑树或链接列表,则迭代器可能是双向的,但不是随机访问。如果它们包装一个向量(作为一个数组实现),你将拥有RandomAccess和Bidirectional。
迭代器是重载某些操作符的对象,所以用法看起来像是指针。这在给定迭代器类别的能力范围内。随机访问迭代器看起来完全像指针,其他类型的迭代器不提供某些操作(例如,list<X>::iterator
是双向的,在许多其他需要随机访问的操作系统中没有运算符+=
)。
至于“晦涩名称”时,它是不能完全不可想象使用一个普通的指针为一个迭代:
template <class T>
class MyContainer
{
...
typedef T* iterator;
}
MyContainer<int>::iterator it; //the type is really int*
迭代器就是提供用于迭代所需的接口的一个概念 - 这些都是不同用于不同类型的迭代器,并在C++标准的第24.1节(迭代器要求)中进行了规定。
如何实现迭代器取决于它们遍历的内容 - 对于向量,它们通常是指向数组的单个指针的包装(无论如何都是在发布版本中),对于更复杂的容器,它们具有更复杂的实现。对于开放式范围,它们将包含用于生成元素的任何算法的状态。
请注意,指向数组元素的指针满足随机访问迭代器的要求,因此它们在某种程度上可以互换。
我认为这个词是* concept *而不是* type *在这里。 – 2010-04-28 10:14:36
我们可以说指针是迭代器的子集吗? – solti 2014-09-11 22:37:03
是的,绝对的 – 2014-09-12 09:44:37