在C ++中,我觉得非常不方便的是C ++没有内置的功能来在运行时为多维数组动态分配内存。
在Java中,我们可以通过一行代码来完成。例如,在Java中,我们可以使用
为4D整数数组动态分配内存int a, b, c, d;
std::cin>>a>>b>>c>>d;
int[ ][ ][ ][ ] array = new int[a][b][c][d];
我用谷歌搜索解决方案在C ++中做同样的事情。但是我发现,在C ++中,我们必须使用嵌套循环,容器或一些带有函数的结构来实现相同的功能。由于这样的语法功能非常方便,我想问一下为什么C ++没有包含这样的内置功能?
答案 0 :(得分:9)
在C ++中,您也可以通过这种方式分配内存。例如:)
auto array = new int[3][4][5][6];
或那是相同的
int ( *array )[4][5][6] = new int[3][4][5][6];
或者您可以使用类型
之类的typedeftypedef int T[4][5][6];
// or
// using T = int[4][5][6];
T *array = new T[3];
问题是除了最左边的方块中的表达式必须是常量表达式。
答案 1 :(得分:2)
首先,永远不要使用new
。对于一切都有更好的选择。
步骤零,正确包括
#include <gsl/multi_span>
#include <memory>
第一步,设置尺寸
constexpr int x_sz = 3;
constexpr int y_sz = 4;
constexpr int z_sz = 5;
constexpr int total = x_sz * y_sz * z_sz;
第二步,分配内存
auto arrptr = std::make_unique<int[]>( total );
第三步,创建一个数组视图
gsl::multi_span<int, x_sz, y_sz, z_sz> arr3d { arrptr.get(), total };
祝贺你有一个边界检查的三维数组 当它超出范围时,它将自行解除分配。
您可以找到GSL here
答案 2 :(得分:1)
我们还可以创建一个大小为(M,N)的2D矩形数组作为
auto array = (int (*)[N]) new int [ M*N ];
和尺寸为(L,M,N)的3D数组为
auto array = (int (*)[M][N]) new int [ L*M*N ];
等(其中L,M,N,......可以是变量)。为此定义宏可能很方便。此外,如果尺寸很小,我们可以简单地做为
int array[M][N];
(我之前从Stackoverflow学到了这一点,非常感谢!)