首页 > 解决方案 > 使用源向量作为目标

问题描述

当使用带有输出迭代器的算法时,例如std::set_difference, 或std::transform,是否有任何简单的方法可以覆盖原始向量?

vector<int> v { 0, 1, 2, 3 };
vector<int> v2{ 1, 3 };

std::set_difference(v.begin(), v.end(), v2.begin(), v2.end(), v.begin());

v = { 0, 2, 2, 3}

在这种特定情况下,我可能可以执行以下操作:

auto it = std::set_difference(v.begin(), v.end(), v2.begin(), v2.end(), v.begin());
v.resize(std::distance(v.begin(), it));

v = { 0, 2 }

但它看起来很麻烦,它的可读性不是很强,而且它只有在目标 <= 到 source in size 时才有效

有没有模块化的方法来解决这个问题?

标签: c++std

解决方案


set_difference要求输出范围不与任一输入范围重叠。

您必须将差异构建到新向量中。然后您可以将该结果交换回原始向量。

vector<int> result;
std::set_difference(v.begin(), v.end(), v2.begin(), v2.end(), std::back_inserter(result));
std::swap(v, result);

推荐阅读