我有一个std::vector<std::shared_ptr<Foo>>
我想从中删除匹配某个谓词的项目。被移除的对象应该有一个被调用的方法,该方法设置一些状态以便在其他地方使用。
当返回 true 时,我不应该在谓词函数中这样做吗?感觉有点像混合关注点,但我能想到的唯一选择似乎更丑陋。
我有一个std::vector<std::shared_ptr<Foo>>
我想从中删除匹配某个谓词的项目。被移除的对象应该有一个被调用的方法,该方法设置一些状态以便在其他地方使用。
当返回 true 时,我不应该在谓词函数中这样做吗?感觉有点像混合关注点,但我能想到的唯一选择似乎更丑陋。
这可能不是一个好主意有两个原因。
首先,大多数标准库算法不应该使用谓词来修改它们所作用的元素。
其次,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());
* 这些算法可能应该被命名keep
为keep_if