迭代器=指针?或者它是什么?

时间:2015-06-20 04:33:57

标签: c++

C ++中的iterator是指针吗?我问的原因是,似乎没有人完全理解迭代器是什么。这只是他们所说的“事物”或“价值”。但迭代器只是指向元素,它的位置。当我们取消引用它时,就像查看迭代器指向的内容一样。这是一个正确的比喻吗?请帮忙

5 个答案:

答案 0 :(得分:5)

简短的回答是:

  • 指针是一种迭代器。
  • 因此可以将指针用作迭代器。
  • 指针具有迭代器以外的属性。

历史

从历史上看,我们有C指针,当C ++发明时,它被改编成C ++。指针表示内存中的位置,因此可以用作数组中的位置。

后来,在20世纪90年代,一个名为" iterator concept"介绍给C ++。 "迭代器概念"与一个名为STL的库(后来被吸收到标准库中)和一个称为"泛型编程"的范例有关。迭代器概念的灵感来自C指针,用于表示vectordeque等容器中的位置,就像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::vectorstd::string类也有迭代器,但由于这些类是经典数组的包装器,因此这些类可能只是相应指针类型的typedef。

迭代器也可以用于循环中迭代变量以外的东西。例如,容器通常具有find方法,该方法将迭代器返回到它找到的对象。