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
不同的对象
这是典型的向量移除-擦除操作的样子:
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