如何处理向量属性的向量?

时间:2015-10-05 20:48:55

标签: c++ stl initialization

在一个名为ClassA的C ++类中,我之前有一个名为ClassB的另一个类的double维数组的属性:

私人:     ClassB矩阵[ROWS] [COLS];

其中ROWS和COLS所在的静态值。

我现在正在修改应用程序,以便能够在命令行上指定两个维度。我正在考虑使用vector<vector<ClassB>>代替。在转向此解决方案之前,我想知道默认情况下如何初始化此类对象。 vector属性是自动分配的,但嵌套向量会发生什么?我应该自己分配吗?

注意:我无法找到这个问题的答案,所以如果它是重复的,请告诉我。

1 个答案:

答案 0 :(得分:2)

std::vector<std::vector>的默认构造函数将构造向量向量,但绝对不会为其元素分配内存(在本例中为内向量),除非您明确说明。如果您需要分配与ROWS x COLS对应的内存,请使用例如

std::vector<std::vector<int>> vec(ROWS, std::vector<int>(COLS));

如果你只是说

std::vector<std::vector<int>> vec(ROWS);

然后外部向量的ROWS个元素将被默认构造,因此不会为内部向量分配内存,并且您必须手动保留每个向量或push_back为它们。

std::vector的构造函数在他们所有的荣耀here中定义。

但总的来说,使用嵌套向量是一个坏主意,因为你丢失了数据的局部性,而且代码可能会变慢。换句话说,不能保证数据在内存中是连续的。 vector<vector>在内部将数据存储为指针数组,并且当指针连续存储时,它们指向的每个数据块不保证在内存中相邻。最好使用&#34; flatten&#34;矢量并从2D转换为1D,反之亦然。