VS2017是否有VLA(可变长度阵列)支持解决方法

Is there a VLAs (variable length arrays) support workaround for VS2017?

本文关键字:阵列 支持 方法 解决 是否 VLA VS2017      更新时间:2023-10-16

如此简单的代码,如下所示:

int n;
cin >> n;
int s[n], p[2*(n-1)][3];

我必须翻译成:

int  n;
cin >> n;
vector<int> s(n, 0);
vector<vector<int>> p(2 * (n - 1), vector<int>(3));

我希望看到类似以下内容:

int  n;
cin >> n;
mat s(n), p(2*(n-1), 3);

我绝对不想使用newmake_uniquestd::array + std::vector混合来做这么简单的事情。恕我直言,两行是一团糟,所以我看到了一种让 C 像 sintax 一样保持的方法。

那么什么是解决方法呢?任何基于定义/标准标头/可复制粘贴 STL 的C++类型?

标准C++不支持可变长度数组。

std::vector<int>是实现连续int数据块的惯用方法,这些数据块的大小在编译时未知。一个好的经验法则是使用std::vector,直到你找到一个令人信服的理由不这样做。

标准C++不支持可变长度数组(即至少一个维度不是编译时常量的数组(。因此,你不能写类似的东西 cin >> n; int s[n] .存在一些扩展,但仍然存在 - 对于非常大的n值,如果手头的编译器将这样的数组放在"堆栈"上,您可能会遇到麻烦,这通常比堆更受限制。

标准方法是使用 std::vector<int> s(n) 或者,如果 - 虽然通常不推荐 - 出于某种原因你想要一个不被对象包装的"纯"数组,你可以写int *s = new int[n];,尽管当你不再需要数组时,你有责任调用delete[] s;

alloca是另一种选择。不是标准,但得到广泛支持。

根据标准C++,没有可变长度数组 (VLA(。要么使用 STL std::vector ,要么将变量定义为 const(不能在运行时修改(。