如何处理向量属性的向量? [复制]
Posted
技术标签:
【中文标题】如何处理向量属性的向量? [复制]【英文标题】:How to handle vector of vector attribute? [duplicate] 【发布时间】:2015-10-05 20:48:55 【问题描述】:在一个名为 ClassA 的 C++ 类中,我之前有一个名为 ClassB 的另一个类的双维数组类型的属性:
私人: B类矩阵[ROWS][COLS];
其中 ROWS 和 COLS 是静态值。
我现在正在修改应用程序,以便能够在命令行上指定两个维度。我正在考虑改用vector<vector<ClassB>>
。在转向这个解决方案之前,我想知道默认情况下如何初始化这样的对象。 vector
属性是自动分配的,但是嵌套向量会发生什么?我应该自己分配吗?
注意:我无法找到此问题的答案,因此请告诉我是否重复。
【问题讨论】:
请注意,更好的解决方案可能是编写一个使用单个向量进行存储的二维矩阵类。 【参考方案1】: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>
在内部将数据存储为指针数组,虽然指针是连续存储的,但不能保证它们指向的每个数据块在内存中都是相邻的。最好使用“扁平化”向量并从 2D 转换为 1D,反之亦然。
【讨论】:
请注意,如果T
比int
更复杂,则将调用T
s 构造函数。
@Zereges 是的,调用了元素的默认构造函数。
感谢您的快速答复。我应该在我的 ClassA 的构造函数中进行您提到的分配吗?即使嵌套向量大小为 0,是否也会调用 T 构造函数?
Arf,0是初始值,不是大小!我累了
@ManuelSelva 如果你确定外部向量的大小都是COLS
,那么可以,你可以这样做:struct ClassA std::vector<std::vector<int>> vec; ClassA(): vec(ROWS, std::vector<int>(COLS)) ;
并且如果初始值为0
,您不需要明确指定它。该类型的默认构造函数会将其值初始化为0
。以上是关于如何处理向量属性的向量? [复制]的主要内容,如果未能解决你的问题,请参考以下文章