Mag*_*gix 0 c++ algorithm vector c++-standard-library move-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());
Run Code Online (Sandbox Code Playgroud)
这在大多数情况下都可以正常工作,但我遇到了obj_t类型不允许移动或复制语义的情况。对象是用 插入的vec.emplace_back(),我正在寻找一种remove_if不需要复制或移动的替代方法。
它是否已经存在于某处?如果没有,它将如何建造?
如果对象不可移动/可复制,您希望如何重新排列向量中的对象?Vector 是一个连续的容器 - 所以你不能在不移动结尾的情况下擦除中间的元素。
要解决此问题,请使对象可移动/可复制,将其包裹起来unique_ptr(从而使其可移动),或使用map/set/unordered_map容器之一,因为它们不像std::vector