我打算將一些元素從串列移動到目標容器(比如向量)以進行進一步處理。move_iterator移動到目標和源容器erase的移動部分是否安全?
#include<list>
#include<vector>
#include<iterator>
struct DataPoint {};
int main() {
std::list<Datapoint> d_data; // source
std::vector<Datapoint> v2; // target
v2.insert(v2.end(),
std::make_move_iterator(d_data.begin()),
std::make_move_iterator(d_data.begin() size)
);
d_data.erase(d_data.begin(), d_data.begin() size); // safe? necessary?
//...
//d_batch->addData(v2);
return 0;
}
uj5u.com熱心網友回復:
您可能會發現std::move更容易使用。
是的,您確實需要擦除源容器中移動的元素。
[演示]
#include <algorithm> // move
#include <fmt/ranges.h>
#include<list>
#include<vector>
#include<iterator> // back_inserter
int main() {
std::list<int> l{1, 2, 3, 4, 5}; // source
std::vector<int> v; // target
auto begin_it{std::next(l.begin())};
auto end_it{std::prev(l.end())};
std::move(begin_it, end_it, std::back_inserter(v));
fmt::print("l before erase: {}\n", l);
l.erase(begin_it, end_it);
fmt::print("l after erase: {}\nv: {}\n", l, v);
}
// Outputs:
//
// l before erase: [1, 2, 3, 4, 5]
// l after erase: [1, 5]
// v: [2, 3, 4]
uj5u.com熱心網友回復:
使用 move_iterator 移動到目標并擦除源容器的移動部分是否安全?
是的,兩者都是正確的,您可以從容器中移動物件,并且所有已洗掉的物件都變成“有效但未指定的狀態”。所以,如果你想重新使用它們,你可以分配新的值并使用它。如果不需要,您可以安全地擦除它們。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/535454.html
標籤:C 移动语义
上一篇:C 回圈檔案結構
下一篇:C 向量不保存物件的父物件
