C++中的迭代器是指针吗?我问这个问题是因为似乎没有人完全理解什么是迭代器。他们只是说它是一个“东西”或“值”。但是,迭代器只是指向元素及其位置的简单指针。当我们对其进行解引用时,就像查看迭代器指向的内容。
这个类比正确吗?
简短的回答是:
从历史上看,我们有 C 指针,并且在发明 C++ 时将其适应为 C++。指针表示内存中的位置,因此可以用作数组中的位置。
后来,在 1990 年代,引入了一个称为“迭代器概念”的想法到 C++ 中。 “迭代器概念”与一个名为 STL 的库(后来被吸收到标准库中)和一个称为“通用编程”的范例相关。迭代器概念受到 C 指针的启发,以表示容器中的位置,例如 vector
、deque
等,就像 C 指针表示数组中的位置一样。 迭代器概念经过精心设计,以与 C 指针兼容,因此我们现在可以说 C 指针模拟了迭代器概念。
理解迭代器概念的一种简化方式是,如果数据类型支持一系列操作和行为,以便表示容器中的位置,并启用对元素的某种访问,则可以称其为迭代器。
通过仔细设计迭代器概念,C指针实现了该列表。因此,指针是一种迭代器。
迭代器概念只是对类型的一组要求,这意味着您可以通过C++数据抽象的强大功能创建自己的迭代器。
指针具有其他属性,与迭代器概念无关。
指针的一个重要用途是表达引用语义,即引用远程内存位置中的对象。这种指针的使用后来被认为是不安全的,并导致“智能指针”的发明。通过比较智能指针和迭代器,我们可以发现它们是完全不相关的概念。
指针的另一个用途是引用原始内存位置。这对于应用程序编程来说完全不安全,但对于微控制器编程来说是一种必不可少的操作硬件的工具。
在C语言中,您可以使用一个简单的for
循环和指针变量来遍历数组,例如:
int arr[MAX];
for (int* p = arr; p < arr + MAX; ++p)
{
do_something_with(*p);
}
++
更复杂。std::set<int> s;
for (std::set<int>::const_iterator it = s.begin(); it != s.end(); ++it)
{
do_something_with(*it);
}
std::set<T>::const_iterator
是一个类,它重载了++
和*
运算符,使其看起来像数组元素的指针。在幕后,++
运算符遵循集合内部树结构中的链接以移动到下一个元素。
std::vector
和std::string
类也有迭代器,但由于这些类是经典数组的包装器,因此这些迭代器可能只是相应指针类型的typedef。find
方法。迭代器比指针更通用。如果不是指针,则只是一个普通的类,具有自定义的 operator++()
、operator++(int)
、operator--()
、operator--(int)
、operator->()
、operator*()
等操作符。您可以在这些操作符中实现任何行为,没有什么神奇的地方。
++
前进到下一个元素,而使用随机访问迭代器可以一步到达另一个元素。
http://www.cplusplus.com/reference/iterator/
迭代器通常是包含指针的结构,这些结构提供了容器可以用来遍历其元素的公共接口。但并非总是如此。在一些标准容器的实现中,例如std::vector::iterator
,iterator
只被定义为 typedef T* iterator
。