提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
- 1. 普通迭代器遍历(最基础方式)
- 2. const迭代器遍历(只读场景)
- 3. 反向迭代器遍历(逆序遍历)
- 4. 范围for循环(C++11+,简洁)
- 5. 结构化绑定 + 范围for(C++17+,更直观)
- 6. std::for_each 算法(函数式风格,C++11+)
- 总结
在C++中,std::map是一种有序关联容器,存储键值对(std::pair<const Key, T>)。遍历std::map的方式有多种,根据C++标准版本和使用场景可分为以下几类:
1. 普通迭代器遍历(最基础方式)
通过begin()和end()获取迭代器,遍历所有键值对。迭代器指向的元素是std::pair<const Key, T>,其中first为键(不可修改),second为值(可修改)。
#include<iostream>#include<map>usingnamespacestd;intmain(){map<int,string>myMap={{1,"one"},{2,"two"},{3,"three"}};// 普通迭代器(可修改值)for(map<int,string>::iterator it=myMap.begin();it!=myMap.end();++it){cout<<"键:"<<it->first<<",值:"<<it->second<<endl;// 可以修改值(键不可修改,因为是const)// it->second += "_modified";}return0;}2. const迭代器遍历(只读场景)
若只需读取元素(不修改),使用const_iterator更安全,通过cbegin()和cend()获取。
// const迭代器(只读,不可修改值)for(map<int,string>::const_iterator it=myMap.cbegin();it!=myMap.cend();++it){cout<<"键:"<<it->first<<",值:"<<it->second<<endl;// 错误:it->second = "new"; (const迭代器不允许修改值)}3. 反向迭代器遍历(逆序遍历)
通过rbegin()(指向最后一个元素)和rend()(指向第一个元素前的位置)实现逆序遍历,适用于需要从大到小访问的场景。
// 反向迭代器(逆序遍历)for(map<int,string>::reverse_iterator it=myMap.rbegin();it!=myMap.rend();++it){cout<<"键:"<<it->first<<",值:"<<it->second<<endl;}// const反向迭代器(逆序只读)for(map<int,string>::const_reverse_iterator it=myMap.crbegin();it!=myMap.crend();++it){cout<<"键:"<<it->first<<",值:"<<it->second<<endl;}4. 范围for循环(C++11+,简洁)
C++11引入范围for循环,自动遍历容器,语法更简洁。需注意:遍历的元素是std::pair<const Key, T>的引用(避免拷贝)。
// 范围for(可读可写,通过引用)for(auto&pair:myMap){// auto 推导为 pair<const int, string>cout<<"键:"<<pair.first<<",值:"<<pair.second<<endl;// 可修改值:pair.second = "new_value";}// 范围for(只读,通过const引用)for(constauto&pair:myMap){cout<<"键:"<<pair.first<<",值:"<<pair.second<<endl;}5. 结构化绑定 + 范围for(C++17+,更直观)
C++17的结构化绑定可直接将键值对拆分为键和值变量,无需通过pair.first/second访问,代码更清晰。
// 结构化绑定(C++17+):直接获取键和值for(auto&[key,value]:myMap){// key 对应 first,value 对应 secondcout<<"键:"<<key<<",值:"<<value<<endl;// 可修改值:value = "new_value";}// 只读版本for(constauto&[key,value]:myMap){cout<<"键:"<<key<<",值:"<<value<<endl;}6. std::for_each 算法(函数式风格,C++11+)
结合<algorithm>库的std::for_each和 lambda 表达式,适合需要对元素执行特定操作的场景。
#include<algorithm>// 需包含此头文件// 使用std::for_each + lambdastd::for_each(myMap.begin(),myMap.end(),[](auto&pair){cout<<"键:"<<pair.first<<",值:"<<pair.second<<endl;});总结
- 基础场景:优先用范围for循环(C++11+)或结构化绑定(C++17+),简洁直观。
- 需修改迭代器位置(如中途跳过元素):用普通迭代器。
- 逆序遍历:用反向迭代器。
- 只读场景:加
const修饰(const_iterator或const auto&)。 - 函数式操作:用
std::for_each结合 lambda。
注意:std::map的键是const类型,任何遍历方式都不能修改键,只能修改值(除非用只读方式)。