【问题标题】:Is there a way to declare an array of std::vector of a certain size?有没有办法声明一个特定大小的 std::vector 数组?
【发布时间】:2020-11-05 10:03:21
【问题描述】:

我想声明一个特定长度的向量数组。为了声明一个向量数组,我这样写,例如:

std::vector<double> myarray[17][38][42];

这将创建一个 3 维 17x38x24 数组,其中每个元素的类型为 std::vector&lt;double&gt;

我也知道指定std::vector的大小我可以写,例如:

std::vector<double> myvector(14);

这将创建一个std::vector,并为 14 个元素分配空间。

当我尝试将这两个程序结合起来时遇到了问题。例如写作:

std::vector<double> myarray[17][38][42](14);

我收到此错误:

错误:数组必须用大括号括起来的初始化程序初始化 [-fpermissive]
std::vector myarray[17][38]42;

当我尝试以这种方式初始化它时:

std::vector<double> myotherarray(14)[17][38][42];

我收到此错误:

错误:在“[”标记之前应为“,”或“;”
std::vector myotherarray(14)[17][38][42];

将数组的每个元素声明为一定大小的std::vector 的正确方法是什么?

【问题讨论】:

  • 我认为你做不到。你必须用循环初始化数组,或者std::fill

标签: c++ arrays vector initialization size


【解决方案1】:

你有一个向量数组(array of array of),所以如果你想初始化它,你必须使用大括号初始化列表,并且你必须初始化每个向量元素(实际上是 38* 42 * 14 个向量!)明确地。这似乎不可行。

如果您只想初始化数组中的第一个向量(数组的数组)(或非常少数个向量),您可以这样做:

std::vector<double> vec[17][38][42]{{{std::vector<double>(14)}}};

但从实际的角度来看,您必须循环遍历这些向量数组并resize 它们。

【讨论】:

    【解决方案2】:

    你不能按照你想要的方式初始化这样一个多维数组。但是您可以先声明它,然后使用单独的初始化循环,例如:

    std::vector<double> myarray[17][38][42];
    for(size_t i = 0; i < 17; ++i) {
        for(size_t j = 0; j < 38; ++j) {
            for(size_t k = 0; k < 42; ++k) {
                myarray[i][j][k].resize(14);
            }
        }
    }
    

    或者:

    std::vector<double> myarray[17][38][42];
    for(auto &d1 : myarray) {
        for(auto &d2 : d1) {
            for(auto &elem : d2) {
                elem.resize(14);
            }
        }
    }
    

    但是,如果您在编译时已经知道向量大小,为什么还要使用std::vector?您可以改用std::array,例如:

    std::array<double, 14> myarray[17][38][42];
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多