当前位置:  开发笔记 > 编程语言 > 正文

关于堆的C++多维数组

如何解决《关于堆的C++多维数组》经验,为你挑选了4个好方法。

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



1> Johannes Sch..:

如果您已经知道嵌套尺寸的大小,您还可以使用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使得更容易阅读代码.


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

2> Naveen..:

请参阅: Marshall Cline的C++ FAQ

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



3> e.James..:

为了完整起见,当您提前知道数组边界时,这是在C++中执行此操作的更好方法.使用以下类的好处是您不必关心在数据上调用delete [].这意味着这个类将是异常安全的,以及关于RAII的所有其他好东西.

template
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; }
};

用法:

MultiArray myArray;
myArray(2, 3) = 4;
cout << myArray(2, 3);

编辑:并且,当我在它时,如果你在运行时之前知道数组边界,这里是你可以使用的设置:

template
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; }
};

用法:

Array2D myArray(10, 10);
myArray(3, 4) = 42;
cout << myArray(3, 4);


知道数组边界,这里是你可以使用的设置:

4> Benoît..:

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

}

推荐阅读
放ch养奶牛
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有