如何将一些元素从第一个向量移动到第二个,并且这些元素将从第一个向量中删除?
如果我使用std::move
,则未从第一个向量中删除的元素。
这是我写的代码:
move(xSpaces1.begin() + 7, xSpaces1.end(), back_inserter(xSpaces2));
复活一个旧线程,但我很惊讶没有人提到std::make_move_iterator
与insert
. 它具有在目标向量中预分配空间的重要性能优势:
v2.insert(v2.end(), std::make_move_iterator(v1.begin() + 7),
std::make_move_iterator(v1.end()));
正如其他人指出的那样,第一个向量v1
现在处于不确定状态,所以erase
用来清除混乱:
v1.erase(v1.begin() + 7, v1.end());
std::move
并对元素std::copy
进行操作,而不是容器。您必须单独改变容器。例如,要将 的前 17 个元素移动到新的 vector中:v1
v2
std::vector<Foo> v1, v2;
// populate v1 with at least 17 elements...
auto it = std::next(v1.begin(), 17);
std::move(v1.begin(), it, std::back_inserter(v2)); // ##
v1.erase(v1.begin(), it);
在 line 之后##
, 的前 17 个元素v1
仍然存在,但它们已被“移出”,因此它们处于不确定状态。
允许您移动对象,而std::move
不是复制它们,从而实现更快的执行速度。当您移动一系列值时,节省的费用可能会更大。但是,当您从容器中移动范围时,容器仍会保留曾经被这些值占用的位置。
如果您想摆脱这些占位符,您需要手动调整容器的大小以删除它们(您不必这样做,以防您希望将这些容器点重用于其他元素)。一种方法是调用vector::erase
您移出容器的同一范围。
您不能按照您的想法将元素从一个向量移动到另一个向量;您将始终必须从第一个向量中删除元素位置。
如果要将第一个向量中的所有元素更改为第二个向量,反之亦然,您可以使用swap。
如果要在两个向量之间移动相同数量的元素,可以使用swap_ranges