我遇到了在 C++ 中按值删除元素的问题的答案:
基本上:
vec.erase(std::remove(vec.begin(), vec.end(), valueToRemove), vec.end());
答案是有道理的,但这不是坏风格吗?逻辑是由双重否定组成......有没有更清洁的方法来做到这一点?
我遇到了在 C++ 中按值删除元素的问题的答案:
基本上:
vec.erase(std::remove(vec.begin(), vec.end(), valueToRemove), vec.end());
答案是有道理的,但这不是坏风格吗?逻辑是由双重否定组成......有没有更清洁的方法来做到这一点?
从集合中删除元素包括两个步骤:
对于 C++ 标准库,它们分别是两个独立的函数remove
和erase
。
人们当然可以想象出erase_if
一种更容易使用的函数,但显然当前的代码已经足够好。当然你也可以自己写remove_if
。
这还不错,实际上是一种基于线性时间条件从向量中删除元素的有效方法。从第 35 分钟开始观看此视频。Erase and Remove Idiom 的 STL 解释
请记住,有不同类型的容器:连续的与基于节点的,以及顺序的与关联的。
基于节点的容器允许高效的擦除/插入。顺序容器按插入顺序(即位置)组织元素,而关联容器按(键)值排列它们。
当前所有的关联容器(map/set/unordered)都是基于节点的,使用它们你可以直接擦除元素,你应该直接使用 element-wise 成员erase
函数。列表是基于节点的序列容器,因此您可以有效地擦除单个元素,但按值查找元素需要线性时间,这就是列表提供成员remove
函数的原因。只有序列容器(向量和双端队列)没有简单的方法来按值擦除元素,这就是免费remove
算法的用武之地,它首先重新排列序列,然后允许容器的成员erase
在容器末尾执行有效的擦除。
与标准库的许多通用方面不同,它们在没有任何底层容器知识的情况下工作,复制/擦除习惯用法是需要一些关于容器之间差异的详细知识的事情之一。