Dre*_*kes 6 c++ erase-remove-idiom c++11
我有一个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());
Run Code Online (Sandbox Code Playgroud)
*这些算法应该已经命名keep并且keep_if
| 归档时间: |
|
| 查看次数: |
198 次 |
| 最近记录: |