C++ 擦除和删除/删除算法之间的区别?

C++ 擦除和删除/删除算法之间的区别?,c++,stl,C++,Stl,算法remove和remove_if与成员函数erase之间的真正区别是什么? 这两种方法是否都会导致调用removed objects析构函数?无论您使用何种方法/函数,在删除项时都会调用析构函数。否,删除和删除\u如果只按顺序移动对象。您需要调用erase以使序列实际上更短。remove和remove_if的返回值是可以在erase调用中使用的迭代器,用于缩短序列: sequence.erase(remove(...),sequence.end()); 否,std::remove_if将把

算法remove和remove_if与成员函数erase之间的真正区别是什么?
这两种方法是否都会导致调用removed objects析构函数?

无论您使用何种方法/函数,在删除项时都会调用析构函数。

否,
删除
删除\u如果只按顺序移动对象。您需要调用erase以使序列实际上更短。remove和remove_if的返回值是可以在
erase
调用中使用的迭代器,用于缩短序列:

sequence.erase(remove(...),sequence.end());

否,
std::remove_if
将把与谓词不匹配的元素移动到列表的末尾,并将迭代器返回到新的“end”。擦除将有效地从容器中删除元素(调用dtor)


示例和示例完美地说明了这一区别。

很简单,std::remove使用一个值来确定是否要“删除”元素,而std::remove\u if使用谓词函数。

是,但是remove和remove\u if算法的列表版本(list.remove/list.remove\u if)如何?@Eric,你应该重新措辞你的问题。如果算法是在
中实现的自由函数
Remove
Remove\u(如果
中实现的
list::Remove
list::Remove\u(如果
中实现的话),那么Remove和Remove\u是成员方法。我没有投票,但是,如果
算法确实从容器中删除了任何内容,那么投票结果可能是因为
std::remove
std::remove\u都没有。它们只将不需要的元素重新排序到序列的末尾,并返回一个迭代器,以便调用特定容器的
erase
方法来实际删除这些元素
remove
remove\u(如果
不需要将“已删除”项移动到列表的末尾)。唯一的保证是,在begin和返回的new end之间的项目是通过测试的项目。在那之后可能是任何事情。(有关示例,请参见Meyer的有效STL。)