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,但实际执行时:
- 第一次遍历到key=5,访问
m[7],7不存在,自动插入,输出5 0,此时map结构变化,迭代器失效 - 第二次遍历到key=4,访问
m[6],6不存在,自动插入,输出4 0,map结构再次变化 - 后续迭代器已经完全混乱,不会再遍历到你原本的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
相关产品推荐
相关产品推荐

