【问题标题】:Assigning vector sizes as array lengths将向量大小分配为数组长度
【发布时间】:2018-05-02 00:43:48
【问题描述】:

所以我目前正在用 c++ 编写一个程序,我想做以下声明:

methodOne()
{
    vector<int> one;
    vector<int> two;
... assigning to one and two...
    int a = one.size();
    int b = two.size();
    methodTwo(a, b);
}

methodTwo(int a, int b)
{
    int array[a][b];
}

当我尝试这个时,我得到一个错误:a 和 b 必须是常量
我试图将 a 和 b 分配给 const int a,const int b。然而,这无济于事。我想知道是否有人知道我可以如何解决这种错误。
提前感谢您提供的任何帮助!

【问题讨论】:

  • 可变长度数组不是标准的 c++。
  • 它不容易“修复”,但您可以将数组更改为其他内容,例如另一个向量。
  • 编译器所说的“a 和 b 必须是常量”的意思是它们必须是constexpr(即在编译时已知)。

标签: c++ arrays variable-assignment


【解决方案1】:

我看到你已经在使用向量,所以你可以用

替换你的数组

typedef std::vector< std::vector<int> > matrix; matrix name(a, std::vector<int>(b));

【讨论】:

  • 这比std::vector&lt;int&gt; matrix(a * b)有什么优势?正如我所看到的,它只会导致一些额外的内存碎片和额外的内存使用,因为矩阵的每一行都需要单独的分配和(通常)两个额外的大小和容量指针。
  • 我按照这个答案关注stackoverflow.com/questions/6775643/…
  • 这个答案根本没有解决我的推理。
  • 抱歉重播晚了,在我发布之前我没有看到你的答案,我认为你的方式更好
【解决方案2】:

在程序运行之前必须知道数组的大小。它的大小是其完整类型的一部分,就像元素类型本身一样。

您需要具有动态大小的东西。使用大小为 a * b 的std::vector&lt;int&gt;

methodTwo(int a, int b)
{
    std::vector<int> array(a * b);
}

您也可以改用std::vector&lt;std::vector&lt;int&gt;&gt;,但为什么要这么麻烦呢?毕竟,您可以通过相应地计算偏移量访问一维向量的元素,就像它是二维数据结构一样:

methodTwo(int a, int b)
{
    std::vector<int> array(a * b);
    // ...
    int x = 5;
    int y = 6;
    auto const element = array[y * a + x];
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-06-04
    • 1970-01-01
    • 1970-01-01
    • 2021-07-11
    • 2013-05-15
    • 1970-01-01
    • 1970-01-01
    • 2021-03-26
    相关资源
    最近更新 更多