remove_if 无需移动和复制语义

remove_if without the need of move and copy semantics

这是典型的向量移除-擦除操作的样子:

auto toErase = std::remove_if(vec.begin(), vec.end(),
   [val](obj_t const& obj) { return obj.myval == val; }
); // This actually moves objects around !

vec.erase(toErase, vec.end()); 

这在大多数情况下工作正常,但我遇到了 obj_t 类型不允许移动或复制语义的情况。对象是用 vec.emplace_back() 插入的,我正在寻找不需要复制或移动的 remove_if 的替代方法。

它是否已经存在于某处?如果没有,它将如何构建?

如果不支持复制或移动,就无法从 std::vector 中删除:当您从中间删除某些内容时,您将如何处理大小写?例如,您可以使用 std::list<Class>std::vector<std::shared_ptr<Class>> 而不是 std::vector<Class>

其实如果主要问题围绕remove_if:我推荐你使用shared_ptr或者unique_ptr

如果对象是 non-movable/copyable,您希望如何重新排列向量中的对象? Vector 是一个连续的容器 - 因此您不能在不移动结尾的情况下擦除中间的元素。

要解决此问题,请制作对象 movable/copyable,将其包裹在 unique_ptr 中(从而使其可移动),或者使用 map/set/unordered_map 容器之一,因为那些容器不能重新定位与 std::vector

不同的对象