如何处理矢量属性的矢量?
How to handle vector of vector attribute?
在一个名为 ClassA 的 C++ class 中,我以前有一个名为 ClassB 的另一个 class 的双维数组类型的属性:
私人:
B 类矩阵[ROWS][COLS];
其中 ROWS 和 COLS 为静态值。
我现在正在修改应用程序以便能够在命令行上指定两个维度。我正在考虑改用 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
的构造函数在他们所有的荣耀中定义 here。
但一般来说,使用嵌套向量不是一个好主意,因为您会丢失数据的局部性,并且代码可能会变慢。换句话说,不能保证数据在内存中是连续的。 vector<vector>
在内部将数据存储为指针数组,虽然指针是连续存储的,但不能保证它们指向的每个数据块在内存中都是相邻的。最好使用 "flatten" 向量并将二维转换为一维,反之亦然。
在一个名为 ClassA 的 C++ class 中,我以前有一个名为 ClassB 的另一个 class 的双维数组类型的属性:
私人: B 类矩阵[ROWS][COLS];
其中 ROWS 和 COLS 为静态值。
我现在正在修改应用程序以便能够在命令行上指定两个维度。我正在考虑改用 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
的构造函数在他们所有的荣耀中定义 here。
但一般来说,使用嵌套向量不是一个好主意,因为您会丢失数据的局部性,并且代码可能会变慢。换句话说,不能保证数据在内存中是连续的。 vector<vector>
在内部将数据存储为指针数组,虽然指针是连续存储的,但不能保证它们指向的每个数据块在内存中都是相邻的。最好使用 "flatten" 向量并将二维转换为一维,反之亦然。