簡體   English   中英

在 C++ 中保留二維向量並從數組中復制數據

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM