我想用幂等方法从容器中删除元素(即,如果该元素存在,则将其删除,否则什么也不做,我可以根据需要多次执行此操作,并且结果相同)
据我所知,做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
不存在,但是您必须通过在实用程序函数中组合remove
和erase
来自己制作。
关于c++ - C++删除(如果存在),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/53106809/