我希望用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);
uj5u.com熱心網友回復:
如果源陣列的大小是固定的,強烈建議使用std::array而不是std::vector. std::array具有多維結構的連續記憶體布局,因此std::memcpy如果源陣列在記憶體中也是連續的,則可以用于復制。
回到最初的問題。如果std::vector<std::vector<double>>要從源陣列構造 a,請使用單個回圈從源構造一維向量:
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>>適當大小的 a,而您實際上只是想從源中復制,請使用assign成員函式:
for (int i = 0; i < 1024; i) {
a_v[i].assign(&(a[i][0]), &(a[i][512]));
}
uj5u.com熱心網友回復:
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);
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/495537.html
