remove_if 不需要移动和复制语义

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不需要复制或移动的替代方法。

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

ALX*_*23z 5

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

要解决此问题,请使对象可移动/可复制,将其包裹起来unique_ptr(从而使其可移动),或使用map/set/unordered_map容器之一,因为它们不像std::vector