【发布时间】:2020-07-28 08:16:12
【问题描述】:
这是典型的矢量删除-擦除操作的样子:
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 的替代方法。
它是否已经存在于某个地方?如果没有,怎么建?
【问题讨论】:
-
那么向量可能不适合您?即使使用
emplace_back,向量也可能需要重新分配其数据,这意味着移动/复制对象。 -
请注意,
remove_if除了移动/复制元素之外什么都不做。 (如果你erase位于向量末尾以外的任何地方,则必须再次移动/复制元素)
标签: c++ algorithm vector move-semantics c++-standard-library