繁体   English   中英

为什么 std::set / std::map 和 std::unordered_set / std::unordered_map 没有 std::erase 重载但有 std::erase_if?

[英]Why std::set / std::map and std::unordered_set / std::unordered_map does NOT have std::erase overload but have std::erase_if?

std::erase / std::erase_if对所有序列容器(例如vector / array / list)都有重载。 但是关联容器(例如 set / map)只有std::erase_if 有谁知道为什么?

std::erase_if (std::set)

std::erase_if (std::unordered_set)

在原始提案N4009中找到了这个

设计决策#3:只是谓词,还是值?
这与命名有关。 提供消除(容器,值)和消除如果(容器,预)将是完全可以接受的。 然而,除了提供erase_if(container, pred) 之外,提供erase(container, value) 是有问题的,因此在本提案中已被避免。 问题是有序/无序关联容器具有执行高效查找的擦除(键)成员函数。 这可能会导致混淆擦除(容器,值)的复杂性。 (它必须是线性扫描,即使对于集合 - 擦除(键)与操作符<()等价,但擦除(容器,值)必须使用操作符==(),并且它们不需要有任何特定的关系。)相比之下,erase_if(container, pred)“听起来像”线性复杂性(确实如此),即使对于有序/无序的关联容器也是如此。 当然,lambdas(尤其是 C++14 的通用 lambdas)使得使用 erase_if() 来消除给定值的所有出现相对容易。 非正式地说(即没有硬数据),我发现必须擦除所有出现的特定值比必须擦除满足某些条件的所有元素要少得多。 另一方面,对称性是可取的,它可以防止用户想知道为什么缺少一种风味。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM