C ++中的iterator是指针吗?我问的原因是,似乎没有人完全理解迭代器是什么。这只是他们所说的“事物”或“价值”。但迭代器只是指向元素,它的位置。当我们取消引用它时,就像查看迭代器指向的内容一样。这是一个正确的比喻吗?请帮忙
答案 0 :(得分:5)
简短的回答是:
从历史上看,我们有C指针,当C ++发明时,它被改编成C ++。指针表示内存中的位置,因此可以用作数组中的位置。
后来,在20世纪90年代,一个名为" iterator concept"介绍给C ++。 "迭代器概念"与一个名为STL的库(后来被吸收到标准库中)和一个称为"泛型编程"的范例有关。迭代器概念的灵感来自C指针,用于表示vector
,deque
等容器中的位置,就像C指针如何表示数组中的位置一样。 迭代器概念经过精心设计,与C指针兼容,因此我们现在可以说 C指针模型迭代器概念。
理解迭代器概念的简单方法是,如果数据类型支持操作和行为列表,使其表示容器中的位置,并启用对元素的某种访问,则可以将其称为迭代器。
通过仔细设计迭代器概念, C指针实现了该列表。因此,指针是一种迭代器。
Iterator概念只是对类型的一组要求,意味着您可以通过C ++的数据抽象功能创建自己的迭代器。
Pointer展示了其他属性,它们与迭代器概念无关。
指针的一个重要用途是表达引用语义,即引用远程存储器位置中的对象。这种指针的使用后来被认为是不安全的,并导致发明了"智能指针"。通过比较智能指针和迭代器,我们可以发现它们是完全不相关的概念。
指针的另一个用途是引用原始内存位置。这对于应用程序编程来说是完全不安全的,但它是微控制器编程操作硬件的必备工具。
答案 1 :(得分:3)
没有。迭代器不是"只是一个指针"。
在某些情况下,迭代器可以是指针 - 但它可以更多。迭代器是指针所做的概括。
当您递增指针时,它会前进到内存中的下一个位置(以您正在处理的对象的大小为模)。当你递增一个迭代器时,它会前进到"序列中的下一个元素"。如果您正在使用链接列表,它将前进到列表中的下一个元素。如果您正在使用地图或集合,则使用地图/集合中的下一个元素,依此类推。
答案 2 :(得分:1)
迭代器比指针更通用。在它不是指针的情况下,它只是一个普通的类,具有自定义operator++()
,operator++(int)
,operator--()
,operator--(int)
,operator->()
,{{1您可以在这些运算符中实现您想要的任何行为。这里没什么神奇的。
答案 3 :(得分:1)
迭代器只是一个可用于迭代容器中元素的对象。有不同类别的迭代器。不同之处在于它们支持的操作,例如使用前向迭代器,您可以使用++
从一个元素转到下一个元素,使用随机访问迭代器,您可以在一个步骤中从一个元素转到另一个元素。
http://www.cplusplus.com/reference/iterator/
迭代器通常是容纳指针的结构,指针有一个公共接口,容器可以使用它来横向扩展它们的元素。虽然,情况并非如此。在标准容器的某些实现中,std::vector::iterator
例如iterator
仅定义为typedef T* iterator
实际上,指针和迭代器之间的区别实际上取决于迭代器的实现。
答案 4 :(得分:1)
在C中,您可以使用带有指针变量的简单for
循环遍历数组,如下所示:
int arr[MAX];
for (int* p = arr; p < arr + MAX; ++p)
{
do_something_with(*p);
}
这是有效的,因为数组连续存储在内存中。但对于其他类型的数据结构 - 链接列表,树,哈希表等 - 移动到容器的下一个元素的代码比简单的++
更复杂。
C ++迭代器喜欢一个指针,但它可以推广到所有类型的容器。
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
方法,该方法将迭代器返回到它找到的对象。