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

use*_*067 39 c++ vector

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

   move(xSpaces1.begin() + 7, xSpaces1.end(), back_inserter(xSpaces2));
Run Code Online (Sandbox Code Playgroud)

Ker*_* SB 50

std::movestd::copy操作元素,而不是容器.你必须单独改变容器.例如,要将前17个元素移动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);
Run Code Online (Sandbox Code Playgroud)

在线之后##,前17个元素v1仍然存在,但它们已经"移动",因此它们处于不确定的状态.

  • 另一个选择(而不是`std :: move`)是使用`std :: make_move_iterator`和`vector.assign()` (2认同)

Mil*_*kic 39

复活旧线程,但我很惊讶,没有人提到std::make_move_iterator结合insert.它具有在目标向量中预分配空间的重要性能优势:

v2.insert(v2.end(), std::make_move_iterator(v1.begin() + 7), 
                    std::make_move_iterator(v1.end()));
Run Code Online (Sandbox Code Playgroud)

正如其他人所指出的那样,第一个向量v1现在处于不确定状态,因此用它erase来清除混乱:

v1.erase(v1.begin() + 7, v1.end());
Run Code Online (Sandbox Code Playgroud)

  • @MandeepSingh参见http://www.cplusplus.com/reference/vector/vector/insert/,特别是复杂性部分:“插入元素数量的线性(复制/移动构造)加上位置后的元素数量(移动)。此外,如果范围 insert (3) 中的 InputIterator 至少不属于前向迭代器类别(即,只是一个输入迭代器),则无法预先确定新容量,并且插入会导致大小上的额外对数复杂性(重新分配)。但是,“v1.begin()”返回随机访问迭代器,因此可以确定新容量。 (2认同)

das*_*ght 23

std::move让您移动的对象,而不是复制它们,允许潜在的执行速度更快.移动一系列值时,节省的费用可能会更高.但是,当您从容器移动范围时,容器仍保留曾被这些值占用的位置.

如果要删除这些占位符,则需要手动调整容器大小以删除它们(如果您不希望将这些容器点重用于其他元素,则需要这样做).一种方法是调用vector::erase移出容器的相同范围.


ale*_*nis 5

您无法按照您的想法将元素从一个向量移动到另一个向量;您始终必须从第一个向量中删除元素位置。

如果您想将第一个向量中的所有元素更改为第二个向量,反之亦然,您可以使用swap

如果要在两个向量之间移动相同数量的元素,可以使用swap_ranges