Follow

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use
Contact

Reserve 2D Vector in C++ and copy data from array

I hope to use vector to process the 2d array data obtained by calling a third-party library.

Although I can simply use the loop to assign values one by one, But I prefer to use methods such as insert and copy to deal with this.

I found that reserve doesn’t seem to work here. So I used resize instead.

MEDevel.com: Open-source for Healthcare and Education

Collecting and validating open-source software for healthcare, education, enterprise, development, medical imaging, medical records, and digital pathology.

Visit Medevel

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

I made these attempts:

// 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);
}

Is there any good way to solve this problem.

For a 1D array I write like this:

double *b = new double[1024];
std::vector<double> b_v;

b_v.reserve(1024);
b_v.insert(b_v.end(), b, b + 1024);

>Solution :

If the size of the source array is fixed, it is strongly recommended to use std::array instead of std::vector. std::array has continuous memory layout for multidimensional structures, thus std::memcpy can be used for copy if the source array is also continuous in memory.

Look back to the original question. If you want to construct a std::vector<std::vector<double>> from the source array, use a single loop to construct 1D vectors from the source:

for (int i = 0; i < 1024; ++i) {
    a_v.emplace_back(std::vector<double>(&(a[i][0]), &(a[i][512])));
}

If there is already a std::vector<std::vector<double>> with the proper size, and you literally want to do a copy from the source, use the assign member function:

for (int i = 0; i < 1024; ++i) {
    a_v[i].assign(&(a[i][0]), &(a[i][512]));
}
Add a comment

Leave a Reply

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use

Discover more from Dev solutions

Subscribe now to keep reading and get access to the full archive.

Continue reading