为什么Vector在列表提供时不提供remove()成员函数?

Alo*_*lok 8 c++

如果我想用vector中的值删除所有元素,我调用remove 算法,然后调用vector的erase成员函数来物理删除它.但是在list的情况下,简单的调用删除成员函数,它将删除具有该值的所有元素.我不确定为什么vector在列表执行时不提供删除MF.

对于Exp:我想从向量v中删除值"4".

vector<int> v;
vector<int> ::iterator Itr;
for (int i=0; i< 6; i++)
   v.push_back(i*2);
v.push_back(4);
v.push_back(8);
v.push_back(4);
v.erase(remove(v.begin(),v.end(),4), v.end()); 
Run Code Online (Sandbox Code Playgroud)

和列表:

list.remove(4); // will delete all the element which has value 4
Run Code Online (Sandbox Code Playgroud)

Dav*_*eas 9

问题不是为什么std::vector不提供操作,而是std::list提供它的原因.STL的设计侧重于通过迭代器分离容器和算法,并且在迭代器方面可以有效地实现算法的所有情况下,这是可选的.

但是,有些特定操作可以通过容器知识更有效地实施.这是从容器中删除元素的情况.使用删除擦除习惯用法的成本在容器的大小上是线性的(不能减少太多),但这隐藏了这样的事实:在最坏的情况下,除了其中一个操作之外的所有操作都是对象的副本(唯一的元素)匹配是第一个),这些副本可以代表相当大的隐藏成本.

通过将操作实现为操作std::list复杂性的方法仍然是线性的,但删除的每个元素的相关成本非常低,一对指针复制并释放存储器中的节点.同时,作为列表的一部分的实现可以提供更强的保证:对未被擦除的元素的指针,引用和迭代器不会在操作中失效.

在特定容器中实现的算法的另一个示例是std::list::sort,使用mergesort效率低于std::sort但不需要随机访问迭代器的算法.

所以基本上,算法是作为带迭代器的自由函数实现的,除非有充分的理由在具体容器中提供特定的实现.