擦除前的C ++复制向量范围

时间:2018-06-20 08:14:17

标签: c++

我有

std::vector v_1;
std::vector v_2;

,我想删除v_1中的某些元素,但在执行操作之前将其存储在向量v_2中。沿线的东西

auto deleteIf = [](auto& x) {return x.checkDelete();}
auto it = std::remove_if(v_1.begin(), v_1.end(), deleteIf);
// how can I efficiently copy elements it to v_1 end to v2?
v1.erase(it, v_2.end());

如何最有效地将要擦除的元素复制到v_2?

1 个答案:

答案 0 :(得分:1)

您不能依靠remove_if来保持元素完整。来自cppreference.com

  

[...]指向范围的新逻辑端和物理端之间的元素的迭代器仍然是可取消引用的,但是元素本身具有未指定的值[...]

您必须以某种方式移动它们。

您可以partition将向量分成两部分:

std::vector<type> v_1;
std::vector<type> v_2;

auto split_check = [](auto&) { x.checkDelete() };

// stable_partition will keep the order. if not required use std::partition
auto it = std::stable_partition(v_1.begin(), v_1.end(), split_check);

v_2.insert(v2.end(), it, v_1.end());
v_1.erase(it, v_1.end());

running example

我刚刚意识到来自 T.C。的重复答案,提到的是完全相同的事情... \ _(ツ)_ /¯