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

Dre*_*kes 6 c++ erase-remove-idiom c++11

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

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

jua*_*nza 7

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

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

第二,std::removestd::remove_if没有给你一套好的"删除"元素*.您只能依赖选定要保留的元素."删除"元素实际上可能是"好"元素的副本.由于您正在存储共享指针,因此它们可能指向与"好"元素相同的对象.

另一种方法是使用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());
Run Code Online (Sandbox Code Playgroud)

*这些算法应该已经命名keep并且keep_if