【问题标题】:Init Array of vector.size() in c++ [duplicate]C ++中vector.size()的初始化数组[重复]
【发布时间】:2016-06-12 14:07:01
【问题描述】:

我尝试从互联网上编译一些 c++ 代码 (http://arma.sourceforge.net/shadows/)。

编译代码时,初始化数组时出现错误。 示例(来自代码-> GaussianMixtureModel.cpp Line:122):

void function()
{
  int k = Vector.size();
  uchar* Ptrs[k];
  // Does somthing with the Ptrs
}

我还尝试将其编辑为以下内容:

const int k = Vector.size();

但它没有用。我将不胜感激!

我正在使用 Visual Studio 2012。

感谢您的回答!

【问题讨论】:

  • 你可以用operator newoperator delete在堆上分配它
  • 你也可以粘贴你得到的编译错误吗?

标签: c++ arrays stdvector


【解决方案1】:

可变长度数组不是标准的 C++,它们是 gcc 和 clang 中的编译器扩展。

看起来您尝试编译的代码需要使用上述之一进行编译。

【讨论】:

  • 或者更好的是,维护一个单独的std::vector
【解决方案2】:

这段代码试图使用的是 VLA - 可变长度数组(是的,在这种情况下它仍然是 variable ,即使你将其设为 const )。您可以在此处详细了解它在 Visual Studio 中的工作方式(不起作用)以及为什么不起作用:

【讨论】:

    【解决方案3】:

    正如 Baum mit Augen 所指出的,Visual Studio 不支持可变长度数组的非标准语言扩展。

    为了使程序符合标准,您可以使用动态分配的数组来代替:

    auto Ptrs = std::vector<uchar*>(k);
    

    根据Ptrs 的使用方式,可能需要进行一些其他更改。

    【讨论】:

    • 我认为这是惯用的答案。当 OP 已经通过代码使用 std::vectors 时,保留一个数组是没有用的。 RAII 是要走的路。可能更喜欢智能指针而不是原始指针,但这确实是细节,取决于 OP 想要什么。
    • @erip 一个数组已经符合 RAII 习惯用法。在这种情况下,std::vector 的优点是在编译时不需要知道它的大小。没有上下文,不可能说 OP 是否应该更喜欢智能指针,但由于没有另外提及,我会假设指针不拥有。
    • 不能保持可变长度数组,所以需要动态分配内存——不是 RAII,对吧?至于智能与原始,我完全同意,并且有点认为我的最后评论可能是一个有争议的问题。
    • @erip 很公平。我了解到您正在将 std::vector 解决方案与 OP 最初的解决方案进行比较。但是是的,RAII 确实是更喜欢std::vector 而不是手动动态分配的原因之一。
    【解决方案4】:

    在标准 C++ 中,您只能定义具有编译时间常数 长度的数组。这意味着,您不能使用k,因为它是在运行时确定的。您从 Internet 获得的代码可能使用了一个名为“可变长度数组”(VLA) 的扩展,Visual Studio 没有实现该扩展。

    如果向量清理其内存的语义在您的情况下是正确的,您可以改为定义 uchar* 的向量:

    void function() {
      auto vecSize = Vector.size();
      auto Ptrs= vector<uchar*>(k, nullptr);
      // Does somthing with the Ptrs
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-09-29
      • 1970-01-01
      • 1970-01-01
      • 2012-10-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多