news 2026/4/23 12:31:39

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【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类型,任何遍历方式都不能修改键,只能修改值(除非用只读方式)。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/23 4:02:54

从图片到视频:基于阿里通义Z-Image-Turbo WebUI的动态内容生成

从图片到视频&#xff1a;基于阿里通义Z-Image-Turbo WebUI的动态内容生成 作为一名视频制作人&#xff0c;你是否遇到过这样的困扰&#xff1a;现有的AI工具大多只能生成静态图像&#xff0c;而你想要的是让这些图像动起来&#xff0c;变成生动的动画效果&#xff1f;今天我要…

作者头像 李华
网站建设 2026/4/23 11:21:45

周末项目:用阿里通义Z-Image-Turbo WebUI打造你的个人AI画室

周末项目&#xff1a;用阿里通义Z-Image-Turbo WebUI打造你的个人AI画室 作为一名业余插画师&#xff0c;你是否曾想过借助AI的力量来激发创作灵感&#xff0c;却又被复杂的安装配置劝退&#xff1f;阿里通义Z-Image-Turbo WebUI正是为这类需求而生的开箱即用解决方案。它基于S…

作者头像 李华
网站建设 2026/4/23 11:19:07

阿里通义Z-Image-Turbo WebUI批量处理教程:高效生成海量图像

阿里通义Z-Image-Turbo WebUI批量处理教程&#xff1a;高效生成海量图像 如果你是一位电商运营人员&#xff0c;需要为数千种商品生成展示图片&#xff0c;手动操作效率极低。那么阿里通义Z-Image-Turbo WebUI的批量处理功能就是你的救星。本文将详细介绍如何使用这个强大的AI工…

作者头像 李华
网站建设 2026/4/23 11:21:59

Z-Image-Turbo创意实验:无需顾虑技术限制的艺术探索

Z-Image-Turbo创意实验&#xff1a;无需顾虑技术限制的艺术探索 对于前卫艺术家而言&#xff0c;突破传统媒介限制是永恒的追求&#xff0c;但技术门槛常常成为创意表达的绊脚石。Z-Image-Turbo创意实验正是为解决这一问题而生&#xff0c;它让艺术家能够专注于艺术创作本身&am…

作者头像 李华
网站建设 2026/4/23 11:22:28

懒人必备:一键部署Z-Image-Turbo WebUI的完整教程

懒人必备&#xff1a;一键部署Z-Image-Turbo WebUI的完整教程 如果你是一位数字艺术爱好者&#xff0c;一定听说过Z-Image-Turbo这个神奇的AI图像生成工具。它能在短短1秒内生成照片级质量的图像&#xff0c;而且支持复杂的中文提示词理解。但当你兴冲冲地打开GitHub准备安装时…

作者头像 李华