为什么是C++;没有为多维数组动态分配内存的方便方法吗? 在C++中,我觉得很不方便,C++没有内置的特性来动态地为运行时多维数组分配内存。p>

为什么是C++;没有为多维数组动态分配内存的方便方法吗? 在C++中,我觉得很不方便,C++没有内置的特性来动态地为运行时多维数组分配内存。p>,c++,arrays,multidimensional-array,C++,Arrays,Multidimensional Array,在Java中,我们只需要一行代码就可以完成。例如,在Java中,我们可以使用 int a, b, c, d; std::cin>>a>>b>>c>>d; int[ ][ ][ ][ ] array = new int[a][b][c][d]; 我在C++中搜索了同样的解决方案。但我发现,在C++中,我们必须使用嵌套循环、容器或具有函数的一些结构来实现相同的事情。由于这样的语法特征非常方便,我想问为什么C++没有包含这样一个内置的特性?在C++中,

在Java中,我们只需要一行代码就可以完成。例如,在Java中,我们可以使用

int a, b, c, d;
std::cin>>a>>b>>c>>d;
int[ ][ ][ ][ ] array = new int[a][b][c][d];

我在C++中搜索了同样的解决方案。但我发现,在C++中,我们必须使用嵌套循环、容器或具有函数的一些结构来实现相同的事情。由于这样的语法特征非常方便,我想问为什么C++没有包含这样一个内置的特性?

在C++中,你也可以这样分配内存。例如:)

还是一样

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];

问题是,除最左边的表达式外,正方形中的表达式必须是常量表达式。

我们还可以创建一个大小为(M,N)的二维矩形数组,如下所示:

以及大小为(L,M,N)的3D数组

etc(其中L、M、N……可以是变量)。为此定义宏可能比较方便。此外,如果尺寸很小,我们只需

int array[M][N];

(我以前从Stackoverflow中学到这一点,非常感谢!)

首先,不要使用
新的
。一切都有更好的选择

步骤零,正确包括

#include <gsl/multi_span>
#include <memory>
第二步,分配内存

auto arrptr = std::make_unique<int[]>( total );
auto arrptr=std::使_唯一(总计);
第三步,创建一个数组视图

gsl::multi_span<int, x_sz, y_sz, z_sz> arr3d { arrptr.get(), total };
gsl::multi_span arr3d{arrptr.get(),total};
恭喜你,你有一个三维数组 当它超出范围时,它将释放自己


您可以找到GSL

有趣的事实:Java中的4D数组?它不是4D阵列。它是一个整数数组数组的数组。由于每个动态分配的子阵列之间没有连接,因此速度可能非常慢。CPU从一个分配到下一个分配,从未设法提高从所有预加载到缓存的连续数据中获得的速度。可怕的嵌套循环C++解决方案做同样的事情,而且很可怕。除非您需要交错数组,否则不要使用这两种语言。在处理索引的1D数组周围做一个包装器。这里有一个例子:另一个问题是它有泄漏内存的倾向,例如,当你以一种不寻常的方式退出时。谢谢!我忘了我们可以用汽车。所以这里的自动类型将与int*数组[]相同?你的回答真的很有帮助!但是有没有办法在运行时使用非常量表达式来实现这一点?大多数时候,我不需要使用多维数组。但我决定学好C++,想知道更多的细节。因此,我的第二个问题是什么上下文适合使用多维数组?我们总是需要避开他们吗?@HanM查看我的最新帖子。我展示了其他声明。不幸的是,表达式必须是常量。因此,当数组中元素的数目未知时,数组通常使用标准的容器,例如C++中的STD::vector。“int数组[m ] [n])不担心泄漏,因为它是在栈上分配的(正确的),但是使用原始的“新”和指针有泄漏的风险;因此,我想对于多维数组,尤其是数值计算,使用一些现有的容器类或fast库实际上更好(更安全)。谢谢!我是C++的新手,不确定(int()[n])和(int()[m ] [n]的含义是什么。他们看起来像一种类型。但我不知道如何正确理解它们。它们看起来也像是泛型表达式。@HanM嗨,这根本不是什么特别的事情,它只是对指向矩形数组的指针进行类型转换(参见上面的第二个Vlad示例)。如果你找到一些更好的方法来制作多维阵列,也请告诉我:)谢谢!GSL还没有完成吗?我打算写完后再看。
#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 };