Multidimensional Arrays in C++
C++ does not have a native way of doing multidimensional arrays like some other languages do. There are several ways to workaround this though. Here are some ideas:
Nested Vector method
std::vector object, nest one vector within another like so:
Note: the above array has not been initialised with anything, nor does it have a predefined size at compile time as vectors can be allocated dynamically, therefore so can our makeshift 2D Array. It’s effectively a vector of vectors with type int.
Nested array (
C++11 has a new feature in the standard library:
std::array. Unfortunately it also does not support multidimenional arrays, but you can nest one within another.
This is a 3x3 array as we’ve specified the dimensions in the declaration. We’ve also intialised the values in the array. Only available with C++11.
Using the Template Numerical Toolkit (TNT)
Eventually, the workarounds above can get a bit tiresome, or difficult to read using higher dimensional arrays. In LSDTopoTools, we use a library called the Template Numerical Toolkit, which adds support for multidimensional arrays, without the awkward looking syntax used above. The ‘user-friendly’ documentation is a bit sparse, but the basic examples are here.
The typical way to declare and intialise a TNT array is like so:
It’s not mentioned in the brief tutorial, but you can also do it like this:
Note that assigning ArrayA to ArrayB only produces a shallow copy (a view of the other array). To get a deep copy, you have to do
B = A.copy(). Also, in the LSDTT code, we tend to use a namespace declaration to avoid typing
TNT::Array... all the time:
You could define your own template (good luck!) or use C-style arrays (ugh…).
In the LSDTT code you might also see the Matrix Template Library (MTL). This is another matrix/array library with some more powerful functions for doing matrix algebra. There’s also the Eigen library, which can do a lot of things that the TNT can’t, but is a much bigger library.