C++ STL迭代器适配器

C++ STL迭代器适配器教程

STL 中的迭代器适配器有 5 种,分别是反向迭代器适配器、插入型迭代器适配器、流迭代器适配器、流缓冲区迭代器适配器、移动迭代器适配器。

所谓迭代器适配器,其本质也是一个模板类,比较特殊的是,该模板类是借助以上 5 种基础迭代器实现的。换句话说,迭代器适配器模板类的内部实现,是通过对以上 5 种基础迭代器拥有的成员方法进行整合、修改,甚至为了实现某些功能还会添加一些新的成员方法。

STL迭代器适配器分类

分类

名称 功能
反向迭代器(reverse_iterator) 又称“逆向迭代器”,其内部重新定义了递增运算符(++)和递减运算符(–),专门用来实现对容器的逆序遍历。
安插型迭代器(inserter或者insert_iterator) 通常用于在容器的任何位置添加新的元素,需要注意的是,此类迭代器不能被运用到元素个数固定的容器(比如 array)上。
流迭代器(istream_iterator / ostream_iterator) 流缓冲区迭代器(istreambuf_iterator / ostreambuf_iterator) 输入流迭代器用于从文件或者键盘读取数据;相反,输出流迭代器用于将数据输出到文件或者屏幕上。 输入流缓冲区迭代器用于从输入缓冲区中逐个读取数据;输出流缓冲区迭代器用于将数据逐个写入输出流缓冲区。
移动迭代器(move_iterator) 此类型迭代器是 C++ 11 标准中新添加的,可以将某个范围的类对象移动到目标范围,而不需要通过拷贝去移动。

说明

不同场景下,由于不同的序列式容器其底层采用的数据结构不同,因此迭代器适配器的执行效率也不尽相同。但通常情况下,使用默认的基础容器即可。当然,我们也可以手动修改,具体的修改迭代器适配器基础容器的方法。

案例

创建并使用迭代器适配器

创建一个迭代器适配器,并使用

#include <iostream> #include <list> using namespace std; int main() { cout << "嗨客网(www.haicoder.net)\n" << endl; std::list<int> values{1024, 1188, 990, 800}; 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 << endl; ++begin; } return 0; }

我们在 Linux 下使用 g++ 进行编译,具体命令如下:

g++ iterator_adapter.cpp -std=c++11

编译后,我们直接运行生成的二进制文件 a.out,如下图所示:

01_STL迭代器适配器.png

我们创建了一个 list,并且使用了迭代器适配器访问了所有元素。

C++ STL迭代器适配器总结

STL 中的迭代器适配器有 5 种,分别是反向迭代器适配器、插入型迭代器适配器、流迭代器适配器、流缓冲区迭代器适配器、移动迭代器适配器。