简体   繁体   中英

How to get dimensions of a multidimensional vector in C++

all

I am using multidimensional STL vector to store my data in C++. What I have is a 3D vector

 vector<vector<vector<double>>> vec;

What I want to retrieve from it is :

 &vec[][1][];    // I need a pointer that points to a 2D matrix located at column 1 in vec

Anyone has any idea to do so? I would be extremly appreciate any help!

Regards

Long

It is best to consider vec just as a vector whose elements happen to be vectors-of-vectors-of-double, rather than as a multi-dimensional structure.

You probably know, but just in case you don't I'll mention it, that this datatype does not necessarily represent a rectangular cuboid . vec will only have that "shape" if you ensure that all the vectors are the same size at each level. The datatype is quite happy for the vector vec[j] to be a different size from the one at vec[k] and likewise for vec[j][n] to be a vector of different size from vec[j][m] , so that your structure is "jagged".

So you want to get a pointer to the vector<vector<double>> that is at index 1 in vec . You can do that by:

vector<vector<double>> * pmatrix = &vec[1];

However this pointer will be an unnecessarily awkward means of accessing that vector<vector<double>> . You certainly won't be able to write the like of:

double d = pmatrix[j][k];

and expect to get a double at coordinates (j,k) in the "matrix addressed by a pmatrix ". Because pmatrix is a pointer-to-a-vector-of-vector-of-double; so what pmatrix[j] refers to is the vector-of-vector-of-double (not vector-of-double) at index j from pmatrix , where the index goes in steps of sizeof(vector<vector<double>>) . The statement will reference who-knows-what memory and very likely crash your program.

Instead, you must write the like of:

double d = (*pmatrix)[j][k];

where (*pmatrix) gives you the vector-of-vector-of-double addressed by pmatrix , or equivalently but more confusingly:

double d = pmatrix[0][j][k];

Much simpler - and therefore, the natural C++ way - is to take a reference , rather than pointer, to the vector<vector<double>> at index 1 in vec . You do that simply by:

vector<vector<double>> & matrix = vec[1];

Now matrix is simply another name for the vector<vector<double>> at index 1 in vec , and you can handle it matrix-wise just as you'd expect (always assuming you have made sure it is a matrix, and not a jagged array).

Another thing to consider was raised in a comment by manu343726. Do you want the code that receives this reference to vec[1] to be able to use it to modify the contents of vec[1] - which would include changing its size or the size of any of the vector<double> s within it?

If you allow modification, that's fine. If you don't then you want to get a const reference . You can do that by:

vector<vector<double> > const & matrix = vec[1];

Possibly, you want the receiving code to be able to modify the double s but not the sizes of the vectors that contain them? In that case, std::vector is the wrong container type for your application. If that's your position I can update this answer to offer alternative containers.

Consider using matrix from some linear algebra library. There are some directions here

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM