【问题标题】:Is there a VLAs (variable length arrays) support workaround for VS2017?VS2017 是否有 VLA(可变长度数组)支持解决方法?
【发布时间】:2018-07-05 16:07:03
【问题描述】:

如此简单的代码:

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。

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

【问题讨论】:

  • C++ 标准不支持 VLA(但某些编译器的扩展支持,例如:g++)。
  • 答案:C++ 中没有 VLA。
  • 第二个sn-p有什么问题?对我来说,完全不清楚问题是什么
  • IMO 唯一的解决方法是您问题中的第二段代码。它出什么问题了?如果您认为它是“一团糟”,那么 C++ 可能不适合您。

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


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

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

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

        【讨论】:

        • 希望您不要介意我的激进编辑。如果您不喜欢它,请回滚。 +1 顺便说一句。
        猜你喜欢
        • 2012-01-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-12-14
        • 2018-06-20
        • 1970-01-01
        • 2014-07-14
        相关资源
        最近更新 更多