C++如何遍历map中的所有键值对?(迭代器用法)

发布时间 - 2026-01-03 00:00:00    点击率:
推荐使用范围for循环遍历std::map键值对,简洁安全;需控制流程时用begin()/end()显式迭代器,注意键不可修改、遍历时禁插删元素。

用迭代器遍历 std::map 中的所有键值对,最常用且推荐的方式是使用范围 for 循环显式声明迭代器。两者底层都依赖 map::iterator(或 const_iterator),本质一致,但写法和适用场景略有不同。

方式一:范围 for 循环(推荐,简洁安全)

适用于只读访问或需要修改值(非键)的场景,代码清晰、不易出错:

std::map myMap = {{"apple", 1}, {"banana", 2}, {"cherry", 3}};

// 遍历所有键值对(自动推导类型)
for (const auto& pair : myMap) {
    std::cout << "Key: " << pair.first << ", Value: " << pair.second << '\n';
}

// 若需修改 value(注意:不能修改 first,因为 key 是 const 的)
for (auto& pair : myMap) {
    pair.second *= 10; // 合法:修改 value
    // pair.first = "new_key"; // 编译错误!key 不可修改
}

方式二:显式使用 begin()/end() 迭代器

适合需要控制遍历流程(如中途 break、条件跳过)、或兼容旧标准(C++11 之前)的场景:

  • map::iterator 可读写 value,但 key 始终不可修改(因 map 按 key 排序,改 key 会破坏结构)
  • map::const_iterator 仅允许读取,更安全,尤其在函数参数中传递时
std::map m = {{1, "one"}, {2, "two"}, {3, "three"}};

// 使用普通迭代器(可修改 value)
for (auto it = m.begin(); it != m.end(); ++it) {
    std::cout << it->first << " -> " << it->second << '\n';
    it->second += "!"; // 修改 value 合法
}

// 使用 const_iterator(只读,更明确语义)
for (auto it = m.cbegin(); it != m.cend(); ++it) {
    std::cout << it->first << " -> " << it->second << '\n';
}

注意事项与常见误区

  • std::map 的迭代器是双向迭代器,支持 ++--,但不支持 += 或随机访问(如 it + 5
  • 遍历时不要在循环中插入或删除元素(除非用 erase() 返回的迭代器),否则会导致迭代器失效、未定义行为
  • 若需边遍历边删除满足条件的元素,用 it = m.erase(it)(C++11 起返回下一个有效迭代器)
  • 键类型必须支持 比较(默认为 std::less),这是 map 有序性的基础

补充:反向遍历

rbegin() / rend() 实现从大到小顺序访问:

for (auto rit = myMap.rbegin(); rit != myMap.rend(); ++rit) {
    std::cout << rit->first << " : " << rit->second << '\n';
}


# app  # ai  # c++  # apple  # 编译错误  # 键值对  # less  # for  # break  # 循环  # map  # 遍历  # 迭代  # 键值  # 这是  # 若需  # 推荐使用  # 适用于  # 或删除  # 但不  # 则会 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 如何破解联通资金短缺导致的基站建设难题?  品牌网站制作公司有哪些,买正品品牌一般去哪个网站买?  如何快速搭建FTP站点实现文件共享?  Swift开发中switch语句值绑定模式  Laravel怎么在Blade中安全地输出原始HTML内容  七夕网站制作视频,七夕大促活动怎么报名?  Laravel PHP版本要求一览_Laravel各版本环境要求对照  VIVO手机上del键无效OnKeyListener不响应的原因及解决方法  详解jQuery停止动画——stop()方法的使用  🚀拖拽式CMS建站能否实现高效与个性化并存?  Laravel如何实现用户注册和登录?(Auth脚手架指南)  如何用低价快速搭建高质量网站?  网站制作免费,什么网站能看正片电影?  微信小程序制作网站有哪些,微信小程序需要做网站吗?  简单实现Android验证码  PHP的CURL方法curl_setopt()函数案例介绍(抓取网页,POST数据)  laravel怎么用DB facade执行原生SQL查询_laravel DB facade原生SQL执行方法  如何撰写建站申请书?关键要点有哪些?  如何在景安服务器上快速搭建个人网站?  如何生成腾讯云建站专用兑换码?  如何为不同团队 ID 动态生成多个独立按钮  高配服务器限时抢购:企业级配置与回收服务一站式优惠方案  Laravel如何实现本地化和多语言支持?(i18n教程)  Laravel怎么实现前端Toast弹窗提示_Laravel Session闪存数据Flash传递给前端【方法】  Laravel如何安装Breeze扩展包_Laravel用户注册登录功能快速实现【流程】  网站制作大概要多少钱一个,做一个平台网站大概多少钱?  如何快速查询域名建站关键信息?  IOS倒计时设置UIButton标题title的抖动问题  如何用ChatGPT准备面试 模拟面试问答与职场话术练习教程  如何快速搭建高效香港服务器网站?  Laravel如何实现URL美化Slug功能_Laravel使用eloquent-sluggable生成别名【方法】  如何快速搭建二级域名独立网站?  如何用wdcp快速搭建高效网站?  Laravel怎么进行浏览器测试_Laravel Dusk自动化浏览器测试入门  Laravel任务队列怎么用_Laravel Queues异步处理任务提升应用性能  深圳网站制作公司好吗,在深圳找工作哪个网站最好啊?  Midjourney怎样加参数调细节_Midjourney参数调整技巧【指南】  中国移动官方网站首页入口 中国移动官网网页登录  东莞专业网站制作公司有哪些,东莞招聘网站哪个好?  网站制作报价单模板图片,小松挖机官方网站报价?  浅谈javascript alert和confirm的美化  Laravel项目如何进行性能优化_Laravel应用性能分析与优化技巧大全  如何解决hover在ie6中的兼容性问题  如何快速生成可下载的建站源码工具?  Windows11怎样设置电源计划_Windows11电源计划调整攻略【指南】  Laravel如何实现模型的全局作用域?(Global Scope示例)  浅述节点的创建及常见功能的实现  Laravel如何创建自定义中间件?(Middleware代码示例)  为什么要用作用域操作符_php中访问类常量与静态属性的优势【解答】  如何在宝塔面板创建新站点?