6

我有一个std::vector<std::shared_ptr<Foo>>我想从中删除匹配某个谓词的项目。被移除的对象应该有一个被调用的方法,该方法设置一些状态以便在其他地方使用。

当返回 true 时,我不应该在谓词函数中这样做吗?感觉有点像混合关注点,但我能想到的唯一选择似乎更丑陋。

4

1 回答 1

7

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

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

其次,std::remove不要std::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());

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

于 2014-05-01T22:11:04.470 回答