2

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

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

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

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

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

这将创建一个std::vector分配给 14 个元素的空间。

当我尝试结合这两个过程时遇到了问题。例如,写作:

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

我收到此错误:

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

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

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

我收到此错误:

错误:预期的 ',' 或 ';' 在'['标记之前
std::vector<double> myotherarray(14)[17][38][42];

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

4

2 回答 2

1

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

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];
于 2020-07-15T20:55:20.707 回答
1

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

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

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

但从实际的角度来看,您必须在循环中迭代这些向量数组和resize它们。

于 2020-07-15T20:09:52.340 回答