如何将一些元素从第一个向量移动到第二个向量,元素将从第一个向量中移除?
如果我使用std::move
,则不会从第一个向量中删除元素
这是我写的代码:
move(xSpaces1.begin() + 7, xSpaces1.end(), back_inserter(xSpaces2));
答案 0 :(得分:45)
std::move
和std::copy
对元素进行操作,而非容器。你必须单独改变容器。例如,要将v1
的前17个元素移动到新的向量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);
在##
行之后,v1
的前17个元素仍在那里,但它们已被“移出”,因此它们处于不确定的状态。
答案 1 :(得分:31)
复活一个旧帖子,但我很惊讶没有人提到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());
答案 2 :(得分:20)
std::move
允许您移动对象,而不是复制它们,从而可以提高执行速度。移动一系列值时,节省的费用可能会更高。但是,当您从容器中执行move a range时,容器仍然保留曾被这些值占用的位置。
如果要删除这些占位符,则需要手动调整容器的大小以便删除它们(如果您不希望将这些容器点重用于其他元素,则需要这样做)。一种方法是在移出容器的相同范围内调用vector::erase
。
答案 3 :(得分:3)
您无法按照您想要的方式将元素从一个向量移动到另一个向量;你必须始终擦除第一个向量中的元素位置。
如果您想将所有元素从第一个向量更改为第二个向量,反之亦然,您可以使用swap。
如果要在两个向量之间移动相同数量的元素,可以使用swap_ranges