C++如何按值删除std::map中值等于1的键值对
删除std::map中指定value条目的实现
针对你定义的以16位字节数组为键、出现频次为值的std::map,要删除所有value等于1的条目,有两种成熟实现,注意规避关联容器迭代器失效的问题:
- 兼容C11及以上版本的通用写法
C11标准中map的erase方法会返回被删除元素的下一个有效迭代器,按如下逻辑遍历即可,不会触发未定义行为:
for (auto iter = possible.begin(); iter != possible.end(); ) { if (iter->second == 1) { iter = possible.erase(iter); } else { ++iter; } }
避坑提醒:不要用
possible.erase(iter++)的老旧写法,虽然在部分老编译器下可以运行,但上述写法是标准明确推荐的安全实现,可读性也更好。
- C20及以上版本的极简写法
C20为所有关联容器新增了std::erase_if批量擦除接口,传入判断逻辑即可一行完成删除:
std::erase_if(possible, [](const auto& item) { return item.second == 1; });
不要直接对std::map使用std::remove/std::remove_if泛型算法:这类算法是给vector、list这类序列容器设计的,通过元素移动覆盖实现删除逻辑,但map的键是const修饰的,无法被移动覆盖,强行调用会直接编译失败,甚至产生不可预期的运行时错误。
内容的提问来源于stack exchange,提问作者user19465844
相关产品推荐
相关产品推荐

