C++面试题(16)| 有指针为什么还要迭代器iterator

557 阅读4分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第9天,点击查看活动详情

image.png

(欢迎大家关注我的微信公众号——控制工程研习,上面会分享很多我学习过程中总结的笔记。)

题目来自阿里C++面试题

1. 有指针为什么还要用迭代器

    (1)通过迭代器访问容器,可以避免许多错误,同时还能隐藏容器的具体实现。

    (2)迭代器可以保证对所有容器的基本遍历方式都是一样的,实现算法时若需要遍历,则使用迭代器,则可以不用关注容器的具体类型,实现数据结构和算法的分离。

    (3)迭代器本身有很多优点,可以弥补C++语言的不足,比如它的iterator_category,可以得到迭代器所指向的类别,这样可以根据不同的类别的特性,提供不同的算法。

迭代器和指针的区别:

指针迭代器
指针在内存中保存地址。迭代器可能包含指针,但它可能是更复杂的东西。例如,迭代器可以循环访问文件系统上、分布在多台计算机上或以编程方式在本地生成的数据。一个很好的例子是链接列表list上的迭代器,迭代器将移动列表中位于节点的元素,这些元素在RAM中的地址可能是分散的。
我们可以对指针执行简单的算术运算,如++,--,添加整数等。并非所有迭代器都允许这些操作,例如,我们不能递减前向迭代器,也不能向非随机访问迭代器添加整数。
T* 类型的指针可以指向任何  T 类型的对象。迭代器受到更多限制,例如,vector::iterator只能引用vector容器内的元素。
我们可以使用delete来删除指针由于迭代器引用容器中的对象,因此与指针不同,迭代器没有删除的概念。(容器负责内存管理。)

2. 迭代器的作用

    iterator类的访问方式就是把不同集合类的访问逻辑抽象出来,使得不用暴露集合内部的结构而达到循环遍历集合的效果。

迭代器的分类:

  • 输入迭代器 Input iterators:它们是所有迭代器中最弱的,并且功能非常有限。它们只能用于单通道算法,即那些按顺序处理容器的算法,使得没有元素被多次访问。
  • 输出迭代器 Output iterators:就像输入迭代器一样,它们的功能也非常有限,只能用于单通道算法,但不能用于访问元素,而是用于分配元素。
  • 前向迭代器 Forward iterators:它们在层次结构中高于输入和输出迭代器,并且包含这两个迭代器中存在的所有特征。 但是,顾名思义,它们也只能向前移动,而且一步一步来。
  • 双向迭代器 Bidireactional iterators:它们具有前向迭代器的所有功能,并且它们克服了正向迭代器的缺点,因为它们可以在两个方向上移动,这就是为什么它们的名称是双向的。
  • 随机访问迭代器 Random access iterators:它们是最强大的迭代器。它们不限于按顺序移动,顾名思义,它们可以随机访问容器内的任何元素。

**
**

迭代器的好处:

  • 编程方便: 如果使用[ ]运算符访问元素,那么我们需要始终担心容器的大小,而使用迭代器,我们可以简单地使用成员函数end()并迭代内容,而不必记住任何事情。
  • 代码可重用性好: 如果我们使用vector的迭代器来访问元素,那么将更改vector而使用list的时候,只需在iterator的声明中将vector改为list就可以达到目的,而无需执行任何其他操作,因此,迭代器支持代码的可重用性,因为它们可用于访问任何容器的元素。
  • 容器的动态处理: 迭代器使我们能够在需要时轻松地在容器中动态添加或删除元素。