最全最简单理解迭代器
1. 迭代器的基础概念(iterator)
1.1 本质
迭代器能够用来遍历容器的对象,与能够遍历数组的指针类似,是广义指针。
1.2 作用:
- 能够让迭代器与算法不干扰的相互发展,最后又能无间隙的粘合起来。
- 重载了*,++,==,!=,=运算符。用以操作复杂的数据结构。
- 容器提供迭代器,算法使用迭代器。
1.3 产生由来
迭代器的设计来源于软件工程中对数据集合遍历的需求。在早期的编程中,特别是那些没有内建数据结构遍历功能的语言,程序员需要编写复杂的循环结构来访问容器中的元素,比如数组、列表或树。这种做法既繁琐又容易出错,特别对于动态大小的数据结构,如果直接操作下标会随着添加或删除元素而变得复杂。
为了简化这个过程并提供一种统一的访问机制,迭代器的概念应运而生。迭代器是一个独立的对象,它按照一定的规则(通常是顺序)逐个返回容器中的元素,开发者无需关心数据的具体存储方式。通过迭代器,可以方便地对各种数据结构进行遍历,提高了代码的灵活性和可维护性。迭代器模式也是设计模式的一种,体现了“隔离关注点”的原则。
简言之,用迭代器遍历比用下标访问访问(就是用[ ]来访问)更通用。因为大多数容器并不是数组实现的,不能用[ ]来访问容器元素,因此c++就需要迭代器这种更加普遍,更加通用的工具来提高效率。
1.4 类型分类
迭代器属于一种数据类型,就像是c语言的内置类型有整型(整型又分为整型int,短整型short,长整型long),浮点型(浮点型又分为浮点float,双精度浮点型double,长精度浮点型long double),类似的,他也有好几种类型——五种:输入迭代器,输出迭代器,前向迭代器,双向迭代器,随机迭代器。
他支持++,--,>,<,>=,<=,==,!= 这几种运算,注意这些运算只是针对迭代器的位置关系(如:两个迭代器相减,得到的是两个迭代器之间的距离),但这些类型的性质有所不同。
以上是他们所支持的运算,但是>,<,>=,<=要自己自定义迭代器去实现。
1.5 迭代器的操作(上面的运算)
与容器相同,迭代器有公共的接口(接口(Interface)是一种抽象类型,用于定义一组方法或属性,但不提供这些方法的具体实现。它是一个合约,规定了类必须实现的方法,以确保不同类之间能够以统一的方式进行交互。):
如果一个迭代器执行某个操作,那么想要实现相同操作的迭代器对于这个操作的实现方式都相同。举个栗子来帮助你的理解吧,标准容器类型上的所有迭代器都允许我们访问容器中的元素(并得到他具体的值),而所有迭代器都是通过解引用运算符来实现这个操作的。类似的,标准库容器的所有迭代器都定义了递增运算符,从当前元素移动到下一个元素。如下有具体的介绍:
表二的运算符只能应用于string,vector,deque和array的迭代器,我们不能把他们用于任何其它类型的迭代器.
1.6 迭代器的范围
一个迭代器的范围(iterator range)由一对迭代器表示,两个迭代器分别指向同一个容器中的第一个元素以及最后一个元素的后面一个位置。这两个迭代器通常被称为begin和end,但也有的地方叫做first和last——有误导(last通常表示最后一个元素,但这里不是指的最后一个元素,有的时候会因为这个被误导,大家注意一下ÿ