关于堆的C++多维数组

epl*_*ess 22 c++ memory arrays heap allocation

我将如何动态分配多维数组?

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使得更容易阅读代码.

  • 这个答案有点令人讨厌:http://stackoverflow.com/questions/198051/why-delete-multidimensionalarray-operator-in-c-does-not-exist#326338,但希望能回答你的疑虑:) (3认同)

Nav*_*een 6

请参阅: Marshall Cline的C++ FAQ

请参阅"如何使用new分配多维数组?" 和"但以前的常见问题解答的代码是SOOOO棘手和容易出错!是不是有一个更简单的方法?" 部分.


e.J*_*mes 6

为了完整起见,当您提前知道数组边界时,这是在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)


Ben*_*oît 6

使用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)