在一个名为ClassA的C ++类中,我之前有一个名为ClassB的另一个类的double维数组的属性:
私人: ClassB矩阵[ROWS] [COLS];
其中ROWS和COLS所在的静态值。
我现在正在修改应用程序,以便能够在命令行上指定两个维度。我正在考虑使用vector<vector<ClassB>>
代替。在转向此解决方案之前,我想知道默认情况下如何初始化此类对象。 vector
属性是自动分配的,但嵌套向量会发生什么?我应该自己分配吗?
注意:我无法找到这个问题的答案,所以如果它是重复的,请告诉我。
答案 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,反之亦然。