C ++ vector <vector <vector <char>&gt; &GT; myVector - 如何用大小初始化?</vector <vector <char>

时间:2014-02-03 20:17:15

标签: c++ vector

使用1D向量,我可以使用类似的东西:

vector<char> letters(5).

如何在初始化3D矢量时完成同样的事情?

这是我尝试过的:

vector<vector<vector<char> row(farms[0][0].size())> farm(farms[0].size())> 
   path(farms.size());

解析时有点棘手,但它只是嵌套三次的第一个示例,并使用与场3D矢量相同的尺寸。它会产生这些错误:

  

p1.cpp:109:错误:模板参数1无效   p1.cpp:109:错误:模板参数2无效   p1.cpp:109:错误:模板参数1无效   p1.cpp:109:错误:模板参数2无效   p1.cpp:109:错误:'('token

之前的声明中的无效类型

3 个答案:

答案 0 :(得分:4)

vector<vector<vector<char> row(farms[0][0].size())>显然不是一种类型。

您所追求的类型是您在标题中写的类型:

vector<vector<vector<char> > >

现在,如果你想预先填充每个维度,使其从一开始就是 5×5×5 向量:

vector<vector<vector<char> > > letters(
  5,
  vector<vector<char> >(
    5,
    vector<char>(
      5,
      '\0'
    )
  )
);

在每个嵌套级别,第一个参数是所需元素的数量,第二个参数是用于填充每个元素的值。

我认为这显然不是好代码。再问自己,真的是否需要三个维度,即使你这样做,也要考虑一个大小 5×5×5 的一维矢量,并在顶部模拟3D索引包装类型。只有当你的矩阵不总是正方形时,这是不合适的,否则除了其他好处之外还有大幅减少动态分配和破坏地点的间接性的特性。

答案 1 :(得分:1)

我想,如果有必要,你必须通过迭代维度来初始化它,即

typedef std::vector<std::vector<std::vector<char > > > vector3d;

vector3d letters(5);

for(int i=0; i<letters.size(); ++i) {
    letters[i].resize(5);
    for(int j=0; j<letters[i].size(); ++j) {
        letters[i][j].resize(5);
    }
}
这样的事情。请注意,这没有测试该代码,因此可能存在小错误。

答案 2 :(得分:1)

typedef std::vector<std::vector<std::vector<char>>> threeVec;
static constexpr unsigned int SIZE = 5;

...

threeVec tv;
tv.reserve(SIZE);
for (auto & i : tv) {
    i.reserve(SIZE);
    for (auto & j : i) {
        j.reserve(SIZE);
    }
}