This question already has answers here:
How do I declare a 2d array in C++ using new?
(24个答案)
2年前关闭。
在C中,当您声明例如
但是,如果在函数内部创建此数组,则将其存储在堆栈中。
我正在寻找一种在具有相同功能的同时将其存储在堆中的方法。因为当我寻找一种方法时,我发现的唯一东西是make
总结是否有可能在堆上存储二维数组,同时保持
编辑:对不起误导每个人,但
EDIT2:实际上,我什至在寻找某种也可以在原始C语言中使用的东西。
请注意,上面的
这个不是指针,因此您使用
当在运行时确定两个大小时,这并不是那么容易。
为了方便起见,以下是该类(未完成,未完成)的一个可能的基本轮廓:
它需要更多代码才能完全起作用,但这是基础。
(24个答案)
2年前关闭。
在C中,当您声明例如
int ar[x][y];
它实际上是int[x*y]
,并且您的调用以所需的方式进行编译。但是,如果在函数内部创建此数组,则将其存储在堆栈中。
我正在寻找一种在具有相同功能的同时将其存储在堆中的方法。因为当我寻找一种方法时,我发现的唯一东西是make
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语言中使用的东西。
最佳答案
如果在编译时至少知道其中一种大小,则可以使用标准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>
的M*N
,并提供两个参数的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];
}
};
它需要更多代码才能完全起作用,但这是基础。