我将如何动态分配多维数组?
如果您已经知道嵌套尺寸的大小,您还可以使用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;
而不是10
,可以传递运行时确定的值.由于它不是类型运算符新返回的一部分,因此是允许的.例如,如果您知道列数,但希望保持行数可变,这很好.typedef使得更容易阅读代码.
请参阅: Marshall Cline的C++ FAQ
请参阅"如何使用new分配多维数组?" 和"但以前的常见问题解答的代码是SOOOO棘手和容易出错!是不是有一个更简单的方法?" 部分.
为了完整起见,当您提前知道数组边界时,这是在C++中执行此操作的更好方法.使用以下类的好处是您不必关心在数据上调用delete [].这意味着这个类将是异常安全的,以及关于RAII的所有其他好东西.
templateclass 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; } };
用法:
MultiArraymyArray; myArray(2, 3) = 4; cout << myArray(2, 3);
编辑:并且,当我在它时,如果你在运行时之前不知道数组边界,这里是你可以使用的设置:
templateclass 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; } };
用法:
Array2D myArray(10, 10); myArray(3, 4) = 42; cout << myArray(3, 4);
使用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; }