Multidimensional Containers in C++

泪湿孤枕 提交于 2019-12-12 15:35:55

问题


Is there any library provide a multidimensional container to use like vector<>?

I would like to see something like:

TwoD<object_class_name> D2;
ThreeD<object_class_name> D3;

and the object_class_name could be any object instead of only the builtin types.

so I can use the object like

D2[i][j]
D3[i,j,k] or D3(i,j,k)

or similar

Thanks.


回答1:


If c++11, a possible solution is using which allows aliasing of a template:

template <typename T>
using TwoD = std::vector<std::vector<T>>;

template <typename T>
using ThreeD = std::vector<std::vector<std::vector<T>>>;

usage:

TwoD<int> t2ints;
TwoD<std::string> t2strings;

ThreeD<int> t3ints;
ThreeD<std::string> t3strings;



回答2:


boost::multi_array can do that.

2D array example:

boost::multi_array<float, 2> float2D(boost::extents[5][10]);
float2D[0][0] = 1.0f;

3D array example:

boost::multi_array<float, 3> float3D(boost::extents[5][10][20]);
float2D[0][0][0] = 1.0f;

The stored type can be a class or struct as well as a primitive type, and the memory used will be contiguous.




回答3:


YOu could do something like this:

std::vector<std::vector<someType> > TwoDVector;

Or a two dimensional array like these:

someType** TwoDArrayPointer;
someType TwoDArray[size][size2];



回答4:


You can use vector.

// Create
vector< vector<int> > vec(4, vector<int>(4));
// Write
vec[2][3] = 10;
// Read
int a = vec[2][3];



回答5:


I don't like vector<vector> because each row gets its own separately allocated memory block on the heap. This causes two problems:

  • Iterating over all elements of the array will have very poor cache performance compared to a contiguous 2D array.
  • You can't pass the array into a function that wants a 1D array. For example, a lot of imaging libraries only want a char * for image data.

Therefore, I would suggest writing your own 2D array template. It's a pretty simple task. Or you can use my public domain code at github.com/jpreiss/array2d .

Also note: you can't overload operator[] with a function that takes more than one parameter. You can overload operator() for 2D indexing.



来源:https://stackoverflow.com/questions/16861290/multidimensional-containers-in-c

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!