map::erase(key)安全删除且返回size_t:存在返回1,不存在返回0;不抛异常,仅被删节点迭代器失效,其他均有效;比find+erase更简洁高效。

map::erase(key) 直接删,但返回值容易被忽略
用 std::map::erase 通过 key 删除单个节点,最简单写法就是 my_map.erase(key)。它会自动查找并移除对应键值对,**不抛异常,即使 key 不存在也安全**。
关键点在于返回值:C++11 起,erase 对 key 的重载返回 size_t(删除的元素个数),不是迭代器。所以别写成 auto it = my_map.erase(key) —— 这会编译失败,因为类型不匹配。
- 存在该 key:返回
1 - 不存在:返回
0 - 想确认是否真删了,可以判断
my_map.erase(key) == 1
为什么不用 find + erase(iter)?
有人习惯先 find 再用迭代器删,比如:
auto it = my_map.find(key);
if (it != my_map.end()) {
my_map.erase(it);
}
这么做没问题,但多了一次查找开销。而 erase(key) 内部也是 O(log n) 查找 + 删除,且只查一次 —— 更简洁、性能略优。
注意:用迭代器删时,erase(it) 返回的是下一个有效迭代器(C++11 起),适合循环中条件删除;但单删一个 key,没必要绕路。
组合式C++代码评审方案,融合静态分析、AI推理、多轮迭代评审和C++专项检查,适用于PR审查、增量代码审查、全项目评审和代码质量评分,触发词包括review cpp、cpp代码评审、C++review、代码审查。
erase 后迭代器失效范围要清楚
map::erase 删除单个节点,**只有被删节点的迭代器失效,其他迭代器和引用全部保持有效**。这点和 vector 完全不同,不用慌。
- 删前拿到的
it2(指向别的 key)删完还能用 - 删前取的
&my_map.at(key)引用,删后访问是未定义行为 - 正在遍历时删当前元素?别用
erase(key),改用erase(it)并接收返回值跳到下一个
key 类型不支持比较会编译失败
erase(key) 底层依赖 map 的比较函数(默认 std::less<key></key>)。如果 Key 没有 运算符,或自定义比较器没正确定义严格弱序,编译会报错,典型信息如:
error: no match for 'operator <p>常见于自定义结构体作 key 却忘了重载 <code>operator,或用了 <code>std::unordered_map</code> 却调 <code>erase(key)</code>(它也有同名函数,但底层是哈希查找)。</code></p> <p>检查方式:确保 <code>Key</code> 可比较,或显式传入比较器模板参数时逻辑一致。</p> <p>删 map 节点这事本身不难,难在删完要不要检查、删的时候正不正在遍历、key 类型靠不靠谱——这三个地方出问题,比语法错误更难定位。</p>
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!










