northfly
northfly

Reputation: 113

Multidimensional Containers in C++

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.

Upvotes: 4

Views: 10383

Answers (5)

japreiss
japreiss

Reputation: 11251

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.

Upvotes: 3

rhashimoto
rhashimoto

Reputation: 15869

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.

Upvotes: 9

MobA11y
MobA11y

Reputation: 18900

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];

Upvotes: 2

hmjd
hmjd

Reputation: 122001

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;

Upvotes: 9

Ashot
Ashot

Reputation: 10979

You can use vector.

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

Upvotes: 1

Related Questions