C++ STL迭代器适配器是什么?
《C++ STL迭代器》一节提到,C++ STL 标准库中迭代器大致分为 5 种类型,分别是输入迭代器、输出迭代器、前向迭代器、双向迭代器以及随机访问迭代器。值得一提的是,这 5 种迭代器是 STL 标准库提供的最基础的迭代器,很多场景中遍历容器的需求,它们并不适。
举个例子,假设有一个 list 容器,现在需要逆序输出该容器中存储的所有元素。要知道,list 容器模板类提供的是双向迭代器,如果使用该类型迭代器实现逆序操作,实现代码如下:
#include <iostream>
#include <list>
using namespace std;
int main()
{
std::list<int> values{1,2,3,4,5};
//找到遍历的开头位置和结尾位置
std::list<int>::iterator begin = --values.end();
std::list<int>::iterator end = --values.begin();
//开始遍历
while (begin != end)
{
cout << *begin << " ";
--begin;
}
return 0;
}
程序执行结果为:
5 4 3 2 1
相比上面这种实现思路,C++ STL 标准库中还提供有更简单的方法,就是使用迭代器适配器。
所谓迭代器适配器,其本质也是一个模板类,比较特殊的是,该模板类是借助以上 5 种基础迭代器实现的。换句话说,迭代器适配器模板类的内部实现,是通过对以上 5 种基础迭代器拥有的成员方法进行整、修改,甚为了实现某些功能还会添加一些新的成员方法。由此,将基础迭代器“改头换面”,就变成了本节要讲的迭代器适配器。关于适配器,在讲解容器适配器时就已经做过详细的讲解,这里不再做过多赘述,读者可阅读《C++ STL容器适配器》一节做详细了解。
本质上讲,迭代器适配器仍属于迭代器,可以理解为是基础迭代器的“翻新版”或者“升级版”。同时,“ x 迭代器适配器”通常直接称为“ x 迭代器”。
C++ STL迭代器适配器种类
C++ 11 标准中,迭代器适配器供有 4 类,它们各自的名称和功能如表 1 所示。名称 | 功能 |
|---|---|
反向迭代器(reverse_iterator) | 又称“逆向迭代器”,其内部重新定义了递增运算符(++)和递减运算符(--),专门用来实现对容器的逆序遍历。 |
安插型迭代器(inserter或者insert_iterator) | 通常用于在容器的任何位置添加新的元素,需要注意的是,此类迭代器不能被运用到元素个数固定的容器(比如 array)上。 |
| 流迭代器(istream_iterator / ostream_iterator) 流缓冲区迭代器(istreambuf_iterator / ostreambuf_iterator) | 输入流迭代器用于从文件或者键盘读取数据;相反,输出流迭代器用于将数据输出到文件或者屏幕上。 输入流缓冲区迭代器用于从输入缓冲区中逐个读取数据;输出流缓冲区迭代器用于将数据逐个写入输出流缓冲区。 |
移动迭代器(move_iterator) | 此类型迭代器是 C++ 11 标准中新添加的,可以将某个范围的类对象移动到目标范围,而不需要通过拷贝去移动。 |
以上 4 种迭代器的用法,后续章节会做详细介绍。
实际上,前面在学习各种容器的迭代器时,我们经常会使用到反向迭代器。下面样例,演示了用反向迭代器适配器遍历 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;
}
程序执行结果为:
5 4 3 2 1
可以看到,程序中通过调用 list 容器模板类提供的 rbegin() 和 rend(),就可以获得逆序遍历容器所需要的反向迭代器,从而轻松实现逆序输出容器中存储的所有数据。
- 随机文章
- 丁克马尔代夫婚礼(一对新人在美丽的马尔代夫举行了婚礼)
- 深圳 马尔代夫 蜜月(深圳新人度假首选,惬意蜜月相约马尔代夫)
- 国足出发马尔代夫(国足前往马尔代夫备战,将迎战菲律宾)
- 国庆暑假马尔代夫(国庆暑假趁早预定,领略马尔代夫美景)
- 情侣沙滩马尔代夫(马尔代夫浪漫之旅——情侣沙滩回忆录)
- 马尔代夫日本比赛(马尔代夫与日本比拼,战况紧张!)
- 马尔代夫飞机拍摄(壮观!从天上俯瞰马尔代夫岛屿美景)
- 昆明马尔代夫航线(昆明至马尔代夫直飞开通!快来抢票!)
- 马尔代夫韩文(, )
- 武汉马尔代夫农场(武汉发现“马尔代夫农场”,引起关注)
- 澳门转机马尔代夫(从澳门中转前往马尔代夫,顺畅旅行!)
- 心中 马尔代夫(探秘马尔代夫:水下旅游和岛屿美景)
- 电信马尔代夫话费(购买马尔代夫电信话费,畅享便利通讯)
- 电子钱包马尔代夫(马尔代夫推出电子钱包,便捷无需现金)
- 罗马马尔代夫浴场(罗马王宫酒店在马尔代夫开设私人浴场)
- 崇州马尔代夫烧烤(崇州旅游胜地推荐:马尔代夫烧烤美食)
- 苏州马尔代夫洗浴(苏州一家洗浴馆致力营造马尔代夫风情)
- 深圳马尔代夫上班(深圳企业推行“马尔代夫上班”新风尚)
- 贺州马尔代夫规划(贺州马尔代夫规划有望推动旅游业发展)
- 马尔代夫主题岛屿(马尔代夫精美主题岛屿:探索蓝色水域)
- 飞过马尔代夫大海(飞越马尔代夫海洋:深度探索蓝色宝藏)
- 马尔代夫午餐做法(如何制作马尔代夫午餐:简单又美味!)
- 马尔代夫仙境游学(穿越童话般的马尔代夫:探索仙境之旅)
- 马尔代夫偷着钓鱼(马尔代夫暗中垂钓:打破禁止钓鱼大门)
- 马尔代夫十大景点(马尔代夫十大景点,惊叹您的度假之旅)
- 贵阳出发马尔代夫(贵阳直飞马尔代夫,开启浪漫海岛之旅)
- 马尔代夫分身视频(马尔代夫女孩搞笑分身视频病毒式传播)
- 马尔代夫不无聊岛(马尔代夫推出新岛屿体验,告别无聊!)
- 马尔代夫别盖小镇(重拾安宁之旅:体验马尔代夫别盖小镇)
- 马尔代夫八星酒店(马尔代夫八星级酒店亮相,豪华无比!)
