Joh*_*itb 24
如果您已经知道嵌套尺寸的大小,您还可以使用new分配多维数组:
typedef int dimensions[3][4];
dimensions * dim = new dimensions[10];
dim[/* from 0 to 9 */][/* from 0 to 2 */][/* from 0 to 3 */] = 42;
delete [] dim;
Run Code Online (Sandbox Code Playgroud)
而不是10,可以传递运行时确定的值.由于它不是类型运算符新返回的一部分,因此是允许的.例如,如果您知道列数,但希望保持行数可变,这很好.typedef使得更容易阅读代码.
请参阅"如何使用new分配多维数组?" 和"但以前的常见问题解答的代码是SOOOO棘手和容易出错!是不是有一个更简单的方法?" 部分.
为了完整起见,当您提前知道数组边界时,这是在C++中执行此操作的更好方法.使用以下类的好处是您不必关心在数据上调用delete [].这意味着这个类将是异常安全的,以及关于RAII的所有其他好东西.
template<typename T, int width, int height>
class MultiArray
{
private:
typedef T cols[height];
cols * data;
public:
T& operator() (int x, int y) { return data[x][y]; }
MultiArray() { data = new cols[width]; }
~MultiArray() { delete [] data; }
};Run Code Online (Sandbox Code Playgroud)
用法:
MultiArray<int, 10, 10> myArray;
myArray(2, 3) = 4;
cout << myArray(2, 3);Run Code Online (Sandbox Code Playgroud)
编辑:并且,当我在它时,如果你在运行时之前不知道数组边界,这里是你可以使用的设置:
template<typename T>
class Array2D
{
private:
const int width;
T * data;
public:
T& operator() (int x, int y) { return data[y*width + x]; }
Array2D(const int w, const int h) : width(w) { data = new T[w*h]; }
~Array2D() { delete [] data; }
};Run Code Online (Sandbox Code Playgroud)
用法:
Array2D myArray(10, 10);
myArray(3, 4) = 42;
cout << myArray(3, 4);Run Code Online (Sandbox Code Playgroud)
使用Boost.Multiarray怎么样?我相信它能很好地满足您的需求! http://www.boost.org/doc/libs/1_37_0/libs/multi_array/doc/user.html#sec_introduction
以下是文档页面的摘录:
#include < boost/multi_array.hpp >
#include < cassert >
int main ()
{
// Create a 3D array that is 3 x 4 x 2
typedef boost::multi_array< double, 3 > array_type;
typedef array_type::index index;
array_type A(boost::extents[3][4][2]);
// Assign values to the elements
int values = 0;
for(index i = 0; i != 3; ++i)
for(index j = 0; j != 4; ++j)
for(index k = 0; k != 2; ++k)
A[i][j][k] = values++;
// Verify values
int verify = 0;
for(index i = 0; i != 3; ++i)
for(index j = 0; j != 4; ++j)
for(index k = 0; k != 2; ++k)
assert(A[i][j][k] == verify++);
return 0;
}
Run Code Online (Sandbox Code Playgroud)