为什么C ++没有为多维数组动态分配内存的便捷方法?

时间:2017-02-16 23:50:13

标签: c++ arrays multidimensional-array

在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 ++没有包含这样的内置功能?

3 个答案:

答案 0 :(得分:9)

在C ++中,您也可以通过这种方式分配内存。例如:)

auto array = new int[3][4][5][6];

或那是相同的

int ( *array )[4][5][6] = new int[3][4][5][6];

或者您可以使用类型

之类的typedef
typedef 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学到了这一点,非常感谢!)