0

0

c++中map怎么遍历_c++ map容器循环访问方式【进阶】

穿越時空

穿越時空

发布时间:2026-02-11 09:16:51

|

631人浏览过

|

来源于php中文网

原创

C++11起推荐用范围for遍历std::map,const auto&安全高效;erase需用返回值更新迭代器;遍历恒按key升序;禁用operator[]于只读循环。

c++中map怎么遍历_c++ map容器循环访问方式【进阶】

用 for-range 遍历 std::map 最简洁安全

现代 C++(C++11 起)推荐用范围 for 循环,代码清晰、不易越界,且自动适配 const 语义。

  • 遍历键值对:直接声明 const std::pair& 或更简单的 const auto&
  • 只读访问时务必加 const 引用,避免意外拷贝 std::string 等大对象
  • 若需修改 value(非 key),用非 const 引用:auto& p → 修改 p.second 合法;但改 p.first 会触发未定义行为(key 不可变)
std::map m = {{1,"a"}, {3,"c"}, {2,"b"}};
for (const auto& p : m) {
    std::cout << p.first << ": " << p.second << "\n"; // 输出按 key 升序:1:a, 2:b, 3:c
}

用迭代器遍历时注意 erase() 的陷阱

std::map::erase(iterator) 会令被删元素的迭代器失效,但**返回下一个有效迭代器**——这是安全删除的唯一正确模式。

  • 错误写法:for (auto it = m.begin(); it != m.end(); ++it) { if (...) m.erase(it); }it 失效后还执行 ++it,UB
  • 正确写法:用 erase() 返回值更新迭代器:it = m.erase(it)(删除时跳过自增)
  • 不删除时才用 ++it;混合逻辑建议拆成两步:先收集待删 key,再批量 erase
// 安全删除所有 value 长度 > 2 的项
for (auto it = m.begin(); it != m.end(); ) {
    if (it->second.length() > 2) {
        it = m.erase(it); // erase 返回下一个有效迭代器
    } else {
        ++it;
    }
}

std::map 的遍历顺序永远是 key 升序

这是 std::map 的根本特性(底层红黑树),和插入顺序无关。如果需要按插入顺序遍历,std::map 不适用。

创客贴设计
创客贴设计

创客贴设计,一款智能在线设计工具,设计不求人,AI助你零基础完成专业设计!

下载
  • 不要试图通过改变遍历方式“恢复”插入序——不可能
  • 替代方案:用 std::vector<:pair>> + 手动查找,或组合 std::map(查)+ std::list(序)
  • 若仅需反向遍历升序结果,用反向迭代器:for (auto it = m.rbegin(); it != m.rend(); ++it)

性能敏感场景慎用 operator[] 在循环中

在遍历中误用 m[key] 可能悄悄插入新元素并触发内存分配,既改变容器状态又拖慢速度。

立即学习C++免费学习笔记(深入)”;

  • 只读遍历时,一律用 it->first/it->secondat(key)(抛异常)
  • operator[] 应只出现在明确需要“访问或默认构造”的上下文中
  • 调试时开启 -D_GLIBCXX_DEBUG(GCC)可捕获某些静默插入问题
遍历本身不难,真正容易出问题的是混用修改操作、忽略底层有序性约束,以及把 map 当作无序容器来用。这些细节不报错,但会让逻辑在边界 case 上突然崩掉。

相关文章

c++速学教程(入门到精通)
c++速学教程(入门到精通)

c++怎么学习?c++怎么入门?c++在哪学?c++怎么学才快?不用担心,这里为大家提供了c++速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

688

2023.08.02

if什么意思
if什么意思

if的意思是“如果”的条件。它是一个用于引导条件语句的关键词,用于根据特定条件的真假情况来执行不同的代码块。本专题提供if什么意思的相关文章,供大家免费阅读。

803

2023.08.22

c语言const用法
c语言const用法

const是关键字,可以用于声明常量、函数参数中的const修饰符、const修饰函数返回值、const修饰指针。详细介绍:1、声明常量,const关键字可用于声明常量,常量的值在程序运行期间不可修改,常量可以是基本数据类型,如整数、浮点数、字符等,也可是自定义的数据类型;2、函数参数中的const修饰符,const关键字可用于函数的参数中,表示该参数在函数内部不可修改等等。

541

2023.09.20

golang map内存释放
golang map内存释放

本专题整合了golang map内存相关教程,阅读专题下面的文章了解更多相关内容。

75

2025.09.05

golang map相关教程
golang map相关教程

本专题整合了golang map相关教程,阅读专题下面的文章了解更多详细内容。

36

2025.11.16

golang map原理
golang map原理

本专题整合了golang map相关内容,阅读专题下面的文章了解更多详细内容。

64

2025.11.17

java判断map相关教程
java判断map相关教程

本专题整合了java判断map相关教程,阅读专题下面的文章了解更多详细内容。

44

2025.11.27

包子漫画网页版入口与全集阅读指南_正版免费漫画快速访问方法
包子漫画网页版入口与全集阅读指南_正版免费漫画快速访问方法

本专题汇总了包子漫画官网和网页版入口,提供最新章节抢先看方法、正版免费阅读指南,以及稳定访问方式,帮助用户快速直达包子漫画页面,无广告畅享全集漫画内容。

47

2026.02.10

MC.JS网页版快速畅玩指南_MC.JS官网在线入口及免安装体验方法
MC.JS网页版快速畅玩指南_MC.JS官网在线入口及免安装体验方法

本专题汇总了MC.JS官网入口和网页版快速畅玩方法,提供免安装访问、不同版本(1.8.8、1.12.8)在线体验指南,以及正版网页端操作说明,帮助玩家轻松进入MC.JS世界,实现即时畅玩与高效体验。

35

2026.02.10

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C# 教程
C# 教程

共94课时 | 9.1万人学习

C 教程
C 教程

共75课时 | 4.6万人学习

C++教程
C++教程

共115课时 | 17万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号