和很多容器一样,map有正向迭代器begin()、end(),有反向迭代器rbegin()、rend(),还有常量迭代器cbegin()、cend()、crbegin()、crend(),(c表示const,可读不可改),这些迭代器都是双向迭代器,只能进行++或--操作,不能+5或-8随机访问。本节抓重点,主要讲map的其他迭代器。在前一节我们就总结了map常用成员函数,可跳转《初识ST库中的map容器》表格搜索关键字“迭代器”查看参数及功能描述。本节主要讲解find()、lower_bound()、upper_bound()、equal_range()。(equal_range()主要在multimap中用的多,map没啥用),值得注意的是,multimap都有这些函数(multimap于map不同的点在于允许重复键值的存在)。
当然,基本的迭代器要会使用,下面代码将会详细介绍:
#include<bits/stdc++.h>//万能头,以效率为中心 #include<string> #include<map>//包含头文件,养成好习惯 /*如何使用map容器迭代器 */ using namespace std; void test() { map<int ,string> mp{{0,"Dptcpp"},{1,"编程问答"},{2,"计算机二级C语言"},{3,"数据结构教程"},{4,"Java教程"}};//建议这样初始化 ,直观具体 /*通过迭代器遍历map容器*/ cout << "通过迭代器遍历map容器: "; for(map<int,string>::iterator it = mp.begin();it!=mp.end();++it) cout <<(*it).second<< " ";//也可以使用"it->"解引用 cout<<'\n'; } int main(){ test(); return 0; }
编译结果如下:
接下来要讨论map相比序列式容器特有的迭代器:find()、lower_bound()、upper_bound()(参数均为Key值,有则返回迭代器,无则返回end())
#include<bits/stdc++.h>//万能头,以效率为中心 #include<string> #include<map>//包含头文件,养成好习惯 /*find()、lower_bound()、upper_bound()、equal_range()*/ using namespace std; void test() { map<int ,string> mp{{0,"Dptcpp"},{1,"编程问答"},{2,"计算机二级C语言"},{3,"数据结构教程"},{4,"Java教程"}};//建议这样初始化 ,直观具体 /*find()*/ cout << "找到key=0的值:" << mp.find(0)->second << "\n"; /*lower_bound*/ cout << "找出所有key<=3的值:"; for(auto it =mp.begin() ;it!=mp.lower_bound(3);++it)cout << it->second << " "; cout <<'\n'; /*upper_bound*/ cout << "找出所有key>=3的值:"; for(auto it =mp.lower_bound(3);it!=mp.end();++it)cout << it->second << " "; cout <<'\n'; /*equal_map(T)*/ /*找到所有key=T的元素,并返回位置迭代器*/ /*equal_range对于map来说很鸡肋 ,但对于multimap来说很有用*/ cout << "找到key=0的区间并输出所有val值:"; auto range = mp.equal_range(0); for(auto it =range.first;it!=range.second;++it)cout << it->second << " "; } int main(){ test(); return 0; }
编译结果如下:
成功编译,我们也是学会了find()、lower_bound()、upper_bound()这三个重点迭代器的使用方法。
总结:我们需要熟练掌握map容器迭代器的使用方法,记得map容器迭代器是双向迭代器,以及熟悉find()、lower_bound()、upper_bound()这三个迭代器函数,最后知道equal_range对于map来说没啥用。
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程