和很多容器一样,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

接下来要讨论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来说没啥用。

点赞(0)

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

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

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

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

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

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

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

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

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