从向量中删除项目,并改变那些被删除的项目

时间:2014-05-01 22:05:37

标签: c++ c++11 erase-remove-idiom

我有一个std::vector<std::shared_ptr<Foo>>我希望erase-remove项匹配某个谓词。删除的对象应该有一个调用的方法,该方法设置一些状态以供在其他地方使用。

当返回true时,我是否应该在谓词函数中执行此操作?感觉有点像混合问题,但我能想到的唯一选择似乎更加丑陋。

1 个答案:

答案 0 :(得分:7)

这可能不是一个好主意有两个原因。

首先,大多数标准库算法不应该使用谓词来修改它们所依赖的元素。

其次,std::removestd::remove_if没有给你一套好的&#34;删除&#34;元素 * 。您只能依赖选定要保留的元素。 &#34;删除&#34;实际上,元素可能是&#34; good&#34;的副本。那些。而且由于你正在存储共享指针,它们可能指向与&#34; good&#34;相同的对象。元件。

另一种方法是使用std::partition,然后遍历分区的相关部分,然后以类似于删除删除习惯用法的方式使用erase

auto p = std::partition(v.begin, v.end(), pred);
std::for_each(p, v.end(), call_method_functor);
v.erase(p, v.end());

*这些算法可能应该被命名为keepkeep_if