概念

可以将迭代器看成是一种指针,但是不完全是指针,因为有些时候迭代器是一个类类型,然后重载了指针的功能,所以迭代器可以像指针一样使用。

C++为什么要设计迭代器这种东西?

迭代器算是C++一个非常重要的抽象概念,它的意义在于:

也就是说C++通过迭代器把不同的容器的元素的访问逻辑抽象了出来。

迭代器的类型

类别简号输出 output输入 input前向 Forward双向 Bidirection随机 Random
 =*p=*p=*p=*p
访问 ->->->->[]
*p= *p=*p=*p=
递代++++++++/--++/--/+/-/+=/-=
比较==/!===/!===/!===/!=/</>/<=/>===/!=/</>/<=/>=

这个表格展示了不同类型迭代器支持的操作:

输入迭代器(Input Iterator)

  • 特点:用于读取容器中的元素,只能向前移动,支持自增操作(++)来指向下一个元素,可进行解引用(*)操作来访问当前元素的值,还能进行相等(==)和不等(!=)比较以判断两个迭代器是否指向同一位置。

  • 应用场景:常用于只读算法,如 std::findstd::count 等,这些算法只需要从容器中读取元素,不需要修改元素的值。

 

输出迭代器(Output Iterator)

  • 特点:用于向容器中写入元素,只能向前移动,支持自增操作(++),可通过解引用(*)操作来修改元素的值,但不能读取元素的值。输出迭代器不支持比较操作。

  • 应用场景:常用于输出算法,如 std::copy 算法可以将一个范围的元素复制到另一个由输出迭代器指定的位置。

 

前向迭代器(Forward Iterator)

  • 特点:结合了输入迭代器和输出迭代器的功能,既能读取又能写入元素,并且可以多次读取同一个元素。它可以向前移动,支持自增操作(++),也支持解引用(*)操作,还能进行相等(==)和不等(!=)比较。

  • 应用场景:适用于需要对容器元素进行读写操作,且只需要单向遍历容器的场景,例如对单链表的遍历和操作。

 

双向迭代器(Bidirectional Iterator)

  • 特点:在向前迭代器的基础上,增加了向后移动的功能,支持自减操作(--),可以方便地在容器中前后移动,进行元素的访问和修改。

  • 应用场景:常用于需要双向遍历容器的算法,如 std::reverse 算法用于反转容器中元素的顺序,就需要双向迭代器来从两端向中间进行元素交换。

 

随机访问迭代器(Random Access Iterator)

  • 特点:具有最强的功能,除了支持双向迭代器的所有操作外,还支持随机访问元素,就像数组下标访问一样,可以通过偏移量直接访问容器中的任意元素。支持加法(+)、减法(-)操作来计算迭代器之间的距离,也支持比较操作(<><=>=)来判断两个迭代器的相对位置。

  • 应用场景:适用于需要快速随机访问元素的算法,如 std::sort 算法对容器中的元素进行排序,通常要求迭代器具有随机访问能力,以便高效地进行元素的比较和交换。

流迭代器

流迭代器是特殊的迭代器,其作用有:

(1)可以将输入/输出流作为容器看待(因为输入输出流都有缓冲区的概念,也可以视为存一些数据),流迭代器可以用来访问输入输出流这种"容器"中的数据。

(2)STL 中有许多算法都是基于迭代器设计的,输入流迭代器和输出流迭代器使得这些算法能够直接应用于输入输出流。因此任何接受迭代器参数的算法都可以和流一起工作。

输出流迭代器

基本概念

输出流迭代器 (Output Stream Iterator)是一种特殊迭代器,专门用于将数据写入输出流。它是一个输出迭代器,只支持写入操作,不支持读取。

声明和使用

应用

基本使用

不同分隔符的使用

与STL算法配合使用

输出到文件

自定义类型的输出

实用工具函数

格式化输出

条件输出

输入流迭代器

基本概念

输入流迭代器 (Input Stream Iterator)是一种特殊迭代器,专门用于从输入流中读取数据。它是一个输入迭代器,只支持读取操作,不支持写入。

声明和使用

1. 基本声明

2. 构造函数

应用

基本使用

从文件读取

与STL算法配合使用

读取不同类型的数据

自定义类型的读取

实用工具函数

错误处理

自定义输入流迭代器

流的组合使用

Important

  1. 只读: 不能修改数据

  2. 单向: 不支持双向遍历

  3. 单遍历: 每个元素只能读取一次

  4. 依赖流: 必须绑定到有效的输入流

  5. I/O阻塞: 可能因为I/O操作而阻塞