我有一个std::vector<std::shared_ptr<Foo>>
我希望erase-remove项匹配某个谓词。删除的对象应该有一个调用的方法,该方法设置一些状态以供在其他地方使用。
当返回true时,我是否应该在谓词函数中执行此操作?感觉有点像混合问题,但我能想到的唯一选择似乎更加丑陋。
答案 0 :(得分:7)
这可能不是一个好主意有两个原因。
首先,大多数标准库算法不应该使用谓词来修改它们所依赖的元素。
其次,std::remove
和std::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());
*这些算法可能应该被命名为keep
和keep_if