C-在本地声明二维数组,并在堆上存储,以非恒定大小



在c中声明时,例如int ar[x][y];实际上是int[x*y],您的调用是以所需的方式编译的。
但是,如果在功能中制成,则将此数组存储在堆栈中。我正在寻找一种将其存储在堆上的方法,同时具有相同的功能。因为当我寻找一种方法时,我唯一发现的是制作int**,然后每个元素(类型int*)将是指向另一个数组的指针。(如果我错了,请纠正我)似乎合法,但是第二种方法不会一个一个又一个地存储值并使用更多内存。对于ar[x][y],第一个方法只是x*y*sizeof(int),但第二种方法是x*y*sizeof(int)+x*sizeof(int*)

总结是否可以将二维阵列存储在堆上,同时保持int ar[x][y]的功能?

编辑:很抱歉误导所有人,但是ar[3][4]只是一个例子,我实际上正在寻找一种使用非恒定大小的方法。

edit2:实际上,我什至在寻找也可以在原始c。

中使用的STH

如果在编译时至少知道其中一种尺寸,则可以使用标准的C 容器:

 using my2daraytype  = std::array<std::array<int, N>, M>; // both N and M are compile time constants
 // allocate this on the heap normally (e.g. with std::make_unique)
 // example
 auto myarray = std::make_unique<my2daraytype>();

请注意,上面的myarray是(智能)指向2D数组的指针,因此您可以访问(*myarray)[i][i]

 using my2daraytype = std::vector<std::array<int, N>>; // inner size N is known
 // data already lives on the heap, no need to allocate
 // example
 my2darraytype myarray(M); 

这个不是指针,因此您使用myarray[i][j]

当运行时确定两个尺寸时,这并不容易。std::vector<std::vector<int>>内存的组织与int**相似,因此不合适。您可能需要创建自己的类,该类内置地存储std::vector<int>的CC_15,并提供两种量表int& operator()(size_t, size_t)用于索引。具有两个方括号的熟悉的语法是可能的,但过于复杂且可能效率低下,因此很少值得麻烦。 myarray(i,j)正常工作,所以只能使用它。

这是为了方便起见的班级(未完成,未讲述)的一个可能的基本轮廓:

template <class T>
class my2darray {
    std::vector<T> values;
    size_t m, n;
   public:
     my2darray(size_t m, size_t n) : values(m*n), m(m), n(n) {}
     T& operator()(size_t i, size_t j) {
          return values[i*n+j];
      }
};

它需要更多的代码才能充分发挥作用,但这是基础。

最新更新