2015-10-05 54 views
0

在称为ClassA的C++类,我以前称为ClassB的另一类型双维阵列的属性:如何处理矢量属性的矢量?

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

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

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

注:我无法找到这个问题的答案,所以请让我知道它是否是重复的。

+0

请注意,更好的解决方案可能是使用单个矢量编写2D矩阵类进行存储。 – juanchopanza

回答

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中定义。

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

+0

请注意,如果'T'比'int'更复杂,那么'T'的构造函数将被调用。 – Zereges

+0

@Zereges是的,元素的默认构造函数被调用。 – vsoftco

+0

感谢您提供非常快速的答案。我应该在我的ClassA的构造函数中执行你提到的分配吗?即使嵌套向量大小为0,T构造函数也会被调用吗? –