迭代器的分类

1、输入迭代器:只读,一次传递
    为输入迭代器预定义实现只有istream_iterator和istreambuf_iterator,用于从一个输入流istream中读取。一个输入迭代器仅能对它所选择的每个元素进行一次解析,它们只能向前移动。一个专门的构造函数定义了超越末尾的值。总是,输入迭代器可以对读操作的结果进行解析(对每个值仅解析一次),然后向前移动。
    2、输出迭代器:只写,一次传递
    这是对输入迭代器的补充,不过是写操作而不是读操作。为输出迭代器的预定义实现只有ostream_iterator和ostreambuf_iterator,用于向一个输出流ostream写数据,还有一个一般较少使用的raw_storage_iterator。他们只能对每个写出的值进行一次解析,并且只能向前移动。对于输出迭代器来说,没有使用超越末尾的值来结束的概念。总之,输出迭代器可以对写操作的值进行解析(对每一个值仅解析一次),然后向前移动。
    3、前向迭代器:多次读/写
    前向迭代器包含了输入和输出迭代器两者的功能,加上还可以多次解析一个迭代器指定的位置,因此可以对一个值进行多次读/写。顾名思义,前向迭代器只能向前移动。没有为前向迭代器预定义迭代器。
    4、双向迭代器:operator--
    双向迭代器具有前向迭代器的全部功能。另外它还可以利用自减操作符operator--向后一次移动一个位置。由list容器中返回的迭代器都是双向的。
    5、随机访问迭代器:类似于一个指针
    随机访问迭代器具有双向迭代器的所有功能,再加上一个指针所有的功能(一个指针就是一个随机访问迭代器),除了没有一种“空(null)”迭代器和空指针对应。基本上可以这样说,一个随机访问迭代器就像一个指针那样可以进行任何操作,包括使用操作符operator[]进行索引,加某个数值到一个指针就可以向前或者向后移动若干个位置,或者使用比较运算符在迭代器之间进行比较。

迭代器类别

说明

输入

从容器中读取元素。输入迭代器只能一次读入一个元素向前移动,输入迭代器只支持一遍算法,同一个输入迭代器不能两遍遍历一个序列

输出

向容器中写入元素。输出迭代器只能一次一个元素向前移动。输出迭代器只支持一遍算法,统一输出迭代器不能两次遍历一个序列

正向

组合输入迭代器和输出迭代器的功能,并保留在容器中的位置

双向

组合正向迭代器和逆向迭代器的功能,支持多遍算法

随机访问

组合双向迭代器的功能与直接访问容器中任何元素的功能,即可向前向后跳过任意个元素

 

迭代器的操作:

每种迭代器均可进行包括表中前一种迭代器可进行的操作。迭代器的操作本质上是通过重载运算符来实现的,迭代器支持何种操作和能够执行什么运算是由迭代器所重载的运算符来决定的。

迭代器操作

说明

所有迭代器

p++

后置自增迭代器

++p

前置自增迭代器

输入迭代器

*p

复引用迭代器,作为右值

p=p1

将一个迭代器赋给另一个迭代器

p==p1

比较迭代器的相等性

p!=p1

比较迭代器的不等性

输出迭代器

*p

复引用迭代器,作为左值

p=p1

将一个迭代器赋给另一个迭代器

正向迭代器

提供输入输出迭代器的所有功能

双向迭代器

--p

前置自减迭代器

p--

后置自减迭代器

随机迭代器

p+=i

将迭代器递增i位

p-=i

将迭代器递减i位

p+i

在p位加i位后的迭代器

p-i

在p位减i位后的迭代器

p[i]

返回p位元素偏离i位的元素引用

p<p1

如果迭代器p的位置在p1前,返回true,否则返回false

p<=p1

p的位置在p1的前面或同一位置时返回true,否则返回false

p>p1

如果迭代器p的位置在p1后,返回true,否则返回false

p>=p1

p的位置在p1的后面或同一位置时返回true,否则返回false

 

只有顺序容器和关联容器支持迭代器遍历,各容器支持的迭代器的类别如下:

容器

支持的迭代器类别

vector

随机访问

deque

随机访问

list

双向

set

双向

multiset

双向

map

双向

multimap

双向

stack

不支持

queue

不支持

priority_queue

不支持

### 迭代器分类与类型 迭代器是 C++ 标准模板库(STL)中的一个重要概念,用于访问和遍历容器中的元素。根据功能和操作能力,迭代器可以分为以下五种主要类型: #### 输入迭代器(Input Iterator) 输入迭代器允许从容器中读取数据,但不能修改容器中的内容。它们只能进行单向移动,即只能向前遍历。这种迭代器适用于只读操作,例如从输入流中读取数据。输入迭代器满足最基本的遍历需求。 #### 输出迭代器(Output Iterator) 输出迭代器允许向容器中写入数据,但不能读取容器中的内容。它们也只支持单向移动。输出迭代器通常用于将数据写入到输出流中,例如写入文件或控制台。 #### 前向迭代器(Forward Iterator) 前向迭代器支持输入和输出操作,允许读取和写入数据,并且可以多次遍历同一元素。它们只能向前移动,但可以在同一个元素上进行多次操作。前向迭代器适用于需要多次访问相同元素的场景。 #### 双向迭代器(Bidirectional Iterator) 双向迭代器支持前向和后向移动,允许在容器中向前或向后遍历。它们可以读取和写入数据,并且支持所有前向迭代器的功能。双向迭代器通常用于需要双向遍历的容器,如 `std::list`。 #### 随机访问迭代器(Random Access Iterator) 随机访问迭代器是最强大的迭代器类型,支持所有双向迭代器的功能,并且可以像指针一样进行算术运算。它们可以随机访问容器中的任何元素,支持加法、减法、比较等操作。随机访问迭代器通常用于需要高效访问的容器,如 `std::vector` 和 `std::deque`。 ### 示例代码 以下是一个使用随机访问迭代器的示例,展示了如何遍历 `std::vector` 容器: ```cpp #include <iostream> #include <vector> int main() { std::vector<int> vec = {1, 2, 3, 4, 5}; for (auto it = vec.begin(); it != vec.end(); ++it) { std::cout << *it << " "; } return 0; } ``` ### 迭代器的类型与容器 每种容器都有一个类级 `typedef` 名称 `iterator`,因此 `std::vector<int>` 的迭代器类型是 `std::vector<int>::iterator`。`std::vector` 的迭代器是随机访问迭代器,而 `std::list` 的迭代器是双向迭代器。指针满足所有的迭代器要求,因此可以作为迭代器使用。 ### 迭代器的灵活性 在编写算法时,尽可能使用要求最低的迭代器,以使其适用于容器的最大区间。各种迭代器的类型是不确定的,而是一种概念性描述。迭代器的主要作用是提供一种统一的方法来访问容器中的元素,而不需要关心容器的具体类型。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值