将元素从std :: vector移动到另一个

时间:2013-02-21 14:18:23

标签: c++ vector

如何将一些元素从第一个向量移动到第二个向量,元素将从第一个向量中移除?
如果我使用std::move,则不会从第一个向量中删除元素 这是我写的代码:

   move(xSpaces1.begin() + 7, xSpaces1.end(), back_inserter(xSpaces2));

4 个答案:

答案 0 :(得分:45)

std::movestd::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