在声明时定义vector的vector的大小

Posted

技术标签:

【中文标题】在声明时定义vector的vector的大小【英文标题】:Define size of vector of vector of vector at the time of declaration 【发布时间】:2015-05-29 03:34:07 【问题描述】:

最近我有机会使用vector<vector<vector<Some_Struct>>> threeFoldVec, 我们不得不将其推送到listthreeFoldVec 的大小在初始化时是已知的。

我知道如何在声明时定义 2_fold 向量的大小。

std::vector<std::vector<SomeStruct>> Layer_1(10, std::vector<SomeStruct>(5));

但是当谈到 3_fold 向量时,我很困惑。

std::vector<std::vector<std::vector<SomeStruct>>> 
                       Layer_1(10, std::vector<std::vector<SomeStruct>>(10));

这样我可以进入第二维。我显然可以循环通过Layer_1 并根据需要使用resizereserve,我有兴趣在原地执行它,只是因为我认为它很复杂。

【问题讨论】:

我也很困惑。 SingleNeuronSomeStruct 一样吗? @Beta 希望只是一个错字,否则无法声明它,因为类型不匹配。 是的..这是错字..现在更正了 【参考方案1】:

你可以这样做:

std::vector<std::vector<std::vector< SomeStruct >>> 
    Layer_1(10, std::vector<std::vector< SomeStruct >>(20, std::vector< SomeStruct >(30)));

这将创建一个10 x 20 x 30 多维数组。请注意,使用嵌套向量效率极低,使用 1D 平面向量并使用 3D 寻址方案要好得多,即对于大小为 HEIGHT x ROWS x COLS 的数组,您将逻辑元素 [i][j][k] 寻址为

[i][j][k] -> i * ROWS * COLS  + j * COLS + k

这将保证您的对象连续存储,因此您的访问时间会更好。

【讨论】:

thx.. 明白了.. 肯定会尝试一维矢量替代方案。如果完成,我将发布两种实现的性能

以上是关于在声明时定义vector的vector的大小的主要内容,如果未能解决你的问题,请参考以下文章

c++ 二维vector的初始化及构造

vector代替数组

c++ stl 几种容器,怎么在声明的时候直接带着大小

stl

std::vector 向下调整大小

C++ 向量<vector>的学习