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

时间:2018-01-26 10:12:33

标签: c++ arrays vector visual-studio-2017 variable-length-array

如此简单的代码:

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

我绝对不想使用new\make_uniquestd::array + std::vector混合来做这些简单的事情。两条线是一个丑陋的混乱恕我直言,所以我希望有一种方法来保持C像sintax。

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

4 个答案:

答案 0 :(得分:7)

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

int是实现std::vector数据的连续块的惯用方法,其大小在编译时是未知的。一个好的经验法则是使用toString(),直到找到令人信服的理由为止。

答案 1 :(得分:4)

标准C ++不支持可变长度数组(即至少一个维度不是编译时间常量的数组)。因此,你不能写select * from cte_cnt201801 order by isnull(mm201711,'z'), isnull(mm201712,'z') 之类的东西。 存在一些扩展,但仍然 - 对于非常大的cin >> n; int s[n]值,如果手头的编译器将这样的数组放在“堆栈”上(通常比堆更有限),则可能会遇到麻烦。

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

答案 2 :(得分:2)

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

答案 3 :(得分:1)

通过标准C ++,没有可变长度数组(VLA)。使用类似std::vector的STL,或将变量定义为const(您无法在运行时修改)。