如此简单的代码:
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_unique
和std::array
+ std::vector
混合来做这些简单的事情。两条线是一个丑陋的混乱恕我直言,所以我希望有一种方法来保持C像sintax。
那么解决方法是什么?任何定义/标准头/可复制存活的基于STL的C ++类型?
答案 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
(您无法在运行时修改)。