反向迭代器适配器,又被称为反向迭代器或逆向迭代器(往后统一“反向迭代器”命名),顾名思义,就是用来逆序输出元素的。读者请牢牢记住,反向迭代器适配器的适配迭代器要么是双向迭代器,要么是随机迭代器,绝不可能是前向迭代器!其原因也可想而知,适配器只是对现有现有功能进行包装,无法为底层迭代器添加原本不支持的操作,比如forward_list这种前向迭代器,它原本就不支持--操作,就别指望forward_list能够使用反向迭代器了。反向迭代器分两种:是否为const修饰,若被修饰则为常量反向迭代器,可读不可改,比如crbegin(),你不能“*crbegin()=?”;否则为非常量反向迭代器,能够支持读改操作。

那么如何创建反向迭代器适配器呢?两种方式,要么直接使用容器提供的反向迭代器接口,要么通过reverse_iterator自己构造。下面我们通过代码来演示一下:

#include<iostream>
#include<iterator>//必须包含!
#include<map>
/*创建反向迭代器适配器*/
using namespace std;
void test()
{
map<string,string> mp{
{"Dotcpp","dotcpp.com"},
{"C语言教程","https://www.dotcpp.com/course/c/"},
{"计算机二级C语言","https://www.dotcpp.com/course/erjic/"},
{"数据结构教程","https://www.dotcpp.com/course/ds/"},
{"Linux命令","https://www.dotcpp.com/course/linuxcmd/"}
};//初始化列表
cout << "正序遍历为:\n";
for(map<string,string>::iterator it = mp.begin();it!=mp.end();++it)
{
cout   <<"想要学习【" << it->first << "】可以访问【" <<it->second << "】\n";
}
/*直接调用现成接口*/
cout << "\n逆序遍历为:\n";
for(map<string,string>::reverse_iterator it = mp.rbegin();it!=mp.rend();++it)
{
cout   <<"想要学习【" << it->first << "】可以访问【" <<it->second << "】\n";
}
/*自己构造一个*/
cout << "\n去除首尾元素逆序遍历为:\n";
map<string,string>::reverse_iterator beg(--mp.end());
map<string,string>::reverse_iterator end(++mp.begin()); 
for(;beg!=end;++beg)
{
cout   <<"想要学习【" << beg->first << "】可以访问【" <<beg->second << "】\n";
}
}
int main(){
    test();
    return 0;
}

编译结果如下:

反向迭代器

可以看到输出完全符合我们的指令!

总结:使用反向迭代器适配器,要么直接用现成接口,要么自己构造接口,如果有const修饰注意其性质为可读不可改,建议读者尝试构造自己的接口,提高对反向迭代器适配器的掌控力。

点赞(0)

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

Dotcpp在线编译      (登录可减少运行等待时间)