如何处理矢量属性的矢量

How to handle vector of vector attribute?

本文关键字:属性 处理 何处理      更新时间:2023-10-16

在一个名为ClassA的c++类中,我先前有另一个名为ClassB的类的二维数组类型的属性:

私人:ClassB矩阵[行][关口];

where ROWS and COLS where静态值

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

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

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的构造函数定义在这里。

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