如何将一些元素从第一个向量移动到第二个向量,元素将从第一个向量中删除?
如果我使用std::move,元素不会从第一个向量中删除.
这是我写的代码:
move(xSpaces1.begin() + 7, xSpaces1.end(), back_inserter(xSpaces2));
Run Code Online (Sandbox Code Playgroud)
Ker*_* SB 50
std::move并std::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仍然存在,但它们已经"移动",因此它们处于不确定的状态.
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)
das*_*ght 23
将std::move让您移动的对象,而不是复制它们,允许潜在的执行速度更快.移动一系列值时,节省的费用可能会更高.但是,当您从容器移动范围时,容器仍保留曾被这些值占用的位置.
如果要删除这些占位符,则需要手动调整容器大小以删除它们(如果您不希望将这些容器点重用于其他元素,则需要这样做).一种方法是调用vector::erase移出容器的相同范围.
您无法按照您的想法将元素从一个向量移动到另一个向量;您始终必须从第一个向量中删除元素位置。
如果您想将第一个向量中的所有元素更改为第二个向量,反之亦然,您可以使用swap。
如果要在两个向量之间移动相同数量的元素,可以使用swap_ranges
| 归档时间: |
|
| 查看次数: |
55783 次 |
| 最近记录: |