You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++ unordered_map两段代码输出与预期不符问题咨询

问题原因分析
  • 核心原因1:std::unordered_map的operator[]存在隐式插入行为
    当你调用m[key]时,如果key不存在于map中,C++标准规定会自动向map插入该key,对应值初始化为0,这个操作会修改map的内部结构,甚至可能触发重哈希。
  • 核心原因2:遍历过程中修改unordered_map会导致迭代器失效
    你在范围for循环遍历unordered_map的同时,调用m[x.first + k]插入了新的key,直接导致正在使用的迭代器失效,遍历行为变成未定义,既不会按照你预期的顺序遍历原有key,甚至会遍历到刚插入的新key,最终输出和预期完全不符。
执行逻辑拆解

初始状态下你的map中只有4个key:1、3、4、5,原本预期的遍历顺序和代码1一致:5→4→1→3,但实际执行时:

  1. 第一次遍历到key=5,访问m[7],7不存在,自动插入,输出5 0,此时map结构变化,迭代器失效
  2. 第二次遍历到key=4,访问m[6],6不存在,自动插入,输出4 0,map结构再次变化
  3. 后续迭代器已经完全混乱,不会再遍历到你原本的key=1、3,反而遍历到了异常的元素,所以后续输出和预期完全不同。
修复方案

不要用operator[]判断key是否存在,改用不会插入新key的count()或者find()方法,避免修改map结构:

for(auto x:m)
{
    cout << x.first << " " << (m.count(x.first + k) ? m.at(x.first + k) : 0) << endl;
}

修改后就会输出你预期的结果。

内容的提问来源于stack exchange,提问作者Turing101

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 11:45:07