当前位置: 首页 > news >正文

【std::map】遍历方式汇总

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

文章目录

      • 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类型,任何遍历方式都不能修改键,只能修改值(除非用只读方式)。

http://www.jsqmd.com/news/216713/

相关文章:

  • Z-Image-Turbo多版本管理:一键切换不同模型配置的云端方案
  • 揭秘AI造相:如何用云端GPU快速体验Z-Image-Turbo的魔力
  • 如何解决 pip install 网络报错 ERROR: Could not find a version that satisfies the requirement requests
  • 玩转AI造相:科哥定制版Z-Image-Turbo镜像一键部署指南
  • typescript-数组和元组
  • 权限分级+加密存储+操作追溯,筑牢会计档案安全防线
  • B站视频列表与详情数据API调用完全指南
  • 告别本地渲染:云端GPU助力AI图像批量生成
  • 信创背景下企业可观测平台选型指南
  • 基于Springboo和vue开发的企业批量排班系统人脸识别考勤打卡系统
  • 低成本实验:用按量付费GPU尝试Z-Image-Turbo的N种玩法
  • 阿里通义Z-Image-Turbo WebUI在教育中的应用:快速搭建AI艺术课堂
  • Z-Image-Turbo模型蒸馏实践:轻量化部署的云端实验环境
  • inline内联函数两个特性
  • 深度优先搜索
  • 2026必备!10个AI论文平台,自考毕业论文轻松搞定!
  • 艺术治疗新工具:无障碍AI绘画环境搭建指南
  • 算法题 递增顺序搜索树
  • 使用 Selenium 爬取京东手机销量与评分数据 (1)
  • inline内联函数双重语义
  • 导师严选2026 AI论文网站TOP10:本科生毕业论文写作全攻略
  • 容器开篇复制弱智问题答案
  • AI+设计:用预置镜像快速构建创意辅助工具
  • LLM动态调药糖尿病副作用砍半
  • 算法题 水果成篮
  • 零成本体验:免费GPU资源+预装镜像玩转AI绘画
  • 科哥手把手教学:1小时掌握Z-Image-Turbo二次开发
  • API开发速成:基于预配置Z-Image-Turbo环境快速构建图像生成服务
  • 技术创业者必看:低成本搭建AI图像生成SaaS
  • 等保二级与三级深度解析及对比分析