我想用幂等方法从容器中删除元素(即,如果该元素存在,则将其删除,否则什么也不做,我可以根据需要多次执行此操作,并且结果相同)

据我所知,做map::erase是幂等的,即使键不存在也很安全。我认为set是相同的。

那么 vector (和类似线性容器)呢?
我知道这很好用:

auto it = std::find(vec.begin(), vec.end(), val);

if (it != vec.end())
  vec.erase(it);

但是我想知道是否有什么方法不需要手动检查it == vec.end()

根据cpp文档,未定义vec.erase(vec.end())的行为,这意味着我们无法执行vec.erase(std::find(..))
有什么方法可以帮我做这个检查,以便我可以用一行代码来完成remove_if_exist吗?

最佳答案

这里的问题不是幂等之一。它是数据访问模型之一。

关联容器(集合, map 等)与序列不同,因为它们具有“键”,这就是为什么您可以一次性进行按键查找和擦除操作的原因。

序列没有键,因此您的比较是不公平的。请注意,对关联容器的等效操作(即按映射值查找-忽略设置,因为奇怪的是其键是它的值!)与序列容器一样冗长。

话虽这么说,the erase-remove idiom确实很烦人(这样做是为了以尽可能多的算法将“范围”与其父容器分开,但仍然如此)。没有理由remove_and_erase不存在,但是您必须通过在实用程序函数中组合removeerase来自己制作。

关于c++ - C++删除(如果存在),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/53106809/

10-12 15:35