[英]Reserve 2D Vector in C++ and copy data from array
我希望用vector來處理調用第三方庫得到的二維數組數據。
雖然我可以簡單地使用循環來一一賦值,但我更喜歡使用插入和復制等方法來處理這個問題。
我發現儲備似乎在這里不起作用。 所以我改用resize。
double **a = new double *[1024];
for (int i = 0; i < 1024; ++i) {
a[i] = new double[512];
}
std::vector<std::vector<double>> a_v;
a_v.resize(1024, std::vector<double>(512));
// Copy a -> a_v
我做了這些嘗試:
// Not Working, just 0 in vector
for (int i = 0; i < 1024; ++i){
a_v[i].insert(a_v[i].end(), a[i], a[i] + 512);
}
有什么好的方法可以解決這個問題。
對於一維數組,我這樣寫:
double *b = new double[1024];
std::vector<double> b_v;
b_v.reserve(1024);
b_v.insert(b_v.end(), b, b + 1024);
std::vector<std::vector<double>> a_v;
a_v.resize(1024, std::vector<double>(512));
只是
std::vector<std::vector<double>> a_v{1024, std::vector<double>(512)};
不幸的是,沒有向量構造函數可以接管 C 樣式數組的所有權。 所以你必須復制所有 1024 * 512 雙打。 並且使用上述向量的定義,您在覆蓋它們之前不必要地初始化所有雙精度數。
您可以使用保留來執行此操作,因此在覆蓋它們之前不會初始化任何雙精度,並且不會復制或移動向量:
std::vector<std::vector<double>> a_v;
a_v.reserve(1024);
for (std::size_t i = 0; i < 1024; ++i) {
a_v.emplace_back();
std::vector<double> &b_v = a_v.back();
b_v.reserve(512);
b_v.insert(b_v.end(), a[i], a[i] + 512);
}
如果源數組的大小是固定的,強烈建議使用std::array
而不是std::vector
。 std::array
具有多維結構的連續內存布局,因此如果源數組在內存中也是連續的,則可以使用std::memcpy
進行復制。
回到最初的問題。 如果要從源數組構造std::vector<std::vector<double>>
,請使用單個循環從源構造一維向量:
std::vector<std::vector<double>> a_v;
a_v.reserve(1024);
for (int i = 0; i < 1024; ++i) {
a_v.emplace_back(std::vector<double>(&(a[i][0]), &(a[i][512])));
}
如果已經有一個大小合適的std::vector<std::vector<double>>
,而您實際上只是想從源中復制,請使用assign
成員函數:
for (int i = 0; i < 1024; ++i) {
a_v[i].assign(&(a[i][0]), &(a[i][512]));
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.