【std::map】遍历方式汇总
2026/8/3 2:26:15 网站建设 项目流程

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

      • 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_iteratorconst auto&)。
  • 函数式操作:用std::for_each结合 lambda。

注意:std::map的键是const类型,任何遍历方式都不能修改键,只能修改值(除非用只读方式)。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询