我正在使用std::remove_if将选择的std::vector元素移动到最后,以便我可以将它们复制到另一个向量然后擦除范围:
using ElemPtr = std::shared_ptr<Elem>;
auto iter = std::remove_if(source.begin(),source.end(), [&](const ElemPtr& e){ /* ... */ });
dest.insert(dest.end(),iter,source.end());
source.erase(iter,source.end());
Run Code Online (Sandbox Code Playgroud)
发生的事情是,在调用之后std::remove_if,要删除的值会调用它们的析构函数(即它们被设置为null).我最终只是复制了一堆空指针,这不是很好.
像cppreference.com这样的资源没有提到这种行为,所以我想知道这是否是编译器错误?
我正在使用gcc 5.2.0.
Igo*_*nik 14
std::remove_if并没有移动元件被移除以结束.取而代之的是,它移动元件不被移除以正面; 尾部的内容未指定.
在此过程中,谓词所说的应该被删除的一些元素可能会被其他元素覆盖(确切地说,从其中分配).对于a的元素shared_ptr,这意味着它可以很好地破坏底层对象.
你似乎在寻找的是std::partition.它的行为与您期望的行为完全一致std::remove_if.
| 归档时间: |
|
| 查看次数: |
477 次 |
| 最近记录: |