为什么std::map::erase按键删除重载返回int而非bool类型?
为什么std::map::erase按key删除的重载返回元素计数而非bool类型
这是STL设计时遵循关联容器接口语义统一原则的典型体现,核心原因有两点:
- 兼容全类型关联容器的泛用性
标准库的关联容器不止std::map这一种,还有std::multimap、std::multiset、std::unordered_multimap等允许重复key的容器,这类容器调用erase(key)时可能删除多个元素,返回计数是合理需求。为了让所有关联容器的erase(key)接口行为完全一致,降低开发者学习成本,同时让泛型代码不需要区分容器是否支持重复key就能正常工作,唯一key的关联容器(std::map、std::set、std::unordered_map等)也沿用了相同的返回值设计。 - 不损失易用性的同时覆盖更多场景
返回计数完全兼容判断删除是否成功的使用需求:C++里0会隐式转换为false,非0转换为true,你完全可以直接把返回值当布尔值使用:
同时还能直接满足统计删除数量的场景,比如批量删除时可以直接累加返回值,不需要额外做布尔值到整数的转换:if (containers.erase("map")) { // 进入分支代表删除成功 }size_t erased_cnt = 0; for (const auto& key : to_delete_keys) { erased_cnt += containers.erase(key); }
另外补充一个常见误区:你提到的返回int是简化描述,C++标准中该接口的返回值类型是容器的size_type,是和size_t对齐的无符号整数类型。
内容的提问来源于stack exchange,提问作者Itachi Uchiwa
相关产品推荐
相关产品推荐

