通过学习 C++ STL 标准库中的容器我们知道,无论是序列式容器还是关联式容器(包括哈希容器),要想遍历容器中存储的数据,就只能用使用该容器模板类中提供的迭代器。
STL迭代器适配器种类
反向迭代器(reverse_iterator)
又称“逆向迭代器”,其内部重新定义了递增运算符(++)和递减运算符(–),专门用来实现对容器的逆序遍历。
安插型迭代器(inserter或者insert_iterator)
通常用于在容器的任何位置添加新的元素,需要注意的是,此类迭代器不能被运用到元素个数固定的容器(比如 array)上。
流迭代器(istream_iterator / ostream_iterator)
流缓冲区迭代器(istreambuf_iterator / ostreambuf_iterator)
输入流迭代器用于从文件或者键盘读取数据;相反,输出流迭代器用于将数据输出到文件或者屏幕上。
输入流缓冲区迭代器用于从输入缓冲区中逐个读取数据;输出流缓冲区迭代器用于将数据逐个写入输出流缓冲区。
移动迭代器(move_iterator)
此类型迭代器是 C++ 11 标准中新添加的,可以将某个范围的类对象移动到目标范围,而不需要通过拷贝去移动。
演示了用反向迭代器适配器遍历 list 容器的实现过程:
#include <iostream>
#include <list>
using namespace std;
int main()
{
std::list<int> values{
1,2,3,4,5 };
//找到遍历的起点和终点,这里无需纠结定义反向迭代器的语法,后续会详细讲解
std::reverse_iterator<std::list<int>::iterator> begin = values.rbegin();
std::reverse_iterator<std::list<int>::iterator> end = values.rend();
while (begin != end) {
cout << *begin << " ";
//注意,这里是 ++,因为反向迭代器内部互换了 ++ 和 -- 的含义
++begin;
}
return 0;
}
反向迭代器适配器(reverse_iterator)
反向迭代器适配器(reverse_iterator),可简称为反向迭代器或逆向迭代器,常用来对容器进行反向遍历,即从容器中存储的最后一个元素开始,一直遍历到第一个元素。
值得一提的是,反向迭代器底层可以选用双向迭代器或者随机访问迭代器作为其基础迭代器。不仅如此,通过对 ++(递增)和 --(递减)运算符进行重载,使得:
- 当反向迭代器执行 ++ 运算时,底层的基础迭代器实则在执行 – 操作,意味着反向迭代器在反向遍历容器;
- 当反向迭代器执行 – 运算时,底层的基础迭代器实则在执行 ++ 操作,意味着反向迭代器在正向遍历容器。
实现反向迭代器的模板类定义在 头文件,并位于 std 命名空间中。
#include <iterator>
using namespace std;
其中,begin 和 end 表示基础迭代器,r(begin) 和 r(end) 分别表示有 begin 和 end 获得的反向迭代器。
#include <iostream>
#include <iterator>
#include <vector>
using namespace std;
int main() {
//创建并初始化一个 vector 容器
std