72

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

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

4 回答 4

81

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

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());
于 2018-02-08T10:29:14.097 回答
69

std::move并对元素std::copy进行操作,而不是容器。您必须单独改变容器。例如,要将 的前 17 个元素移动到新的 vector中:v1v2

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仍然存在,但它们已被“移出”,因此它们处于不确定状态。

于 2013-02-21T14:24:13.743 回答
39

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

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

于 2013-02-21T14:23:37.807 回答
6

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

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

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

于 2013-02-21T14:19:55.693 回答