正在初始化矢量

Initializing vector vector

本文关键字:初始化      更新时间:2023-10-16

我正在使用

vector<vector<size_t>> Ar;

结构。结构的内容随时间变化,特别是每个嵌套向量的长度是随机的,并且随时间变化。顺序很重要,如果嵌套向量为空,我不能忽略它。我知道嵌套向量(比如m)和外部向量(比如n)的最大容量。

我在正确初始化时遇到了一些困难。如果我使用

Ar(n);

没有问题,但我最终得到了内存碎片,因为分配器不知道嵌套向量的大小。如果可能的话,我希望避免这种情况,因为我不知道随着我试图处理的数据大小的增加,它会产生什么影响。我试图通过提前固定嵌套向量的长度来获得紧凑的表示来绕过碎片,但我在这方面遇到了困难。我使用

Ar(n,vector<size_t>(m));

但这是非常慢的,并且是对内存的巨大浪费,因为大多数条目都不会被使用。

我已经用成功地实现了这一点

vector<list<size_t> > Ar(n);

不会出现碎片,但它的运行速度比使用嵌套向量慢得多。像Boost::multi_array这样的固定表示会占用太多空间,原因与上面的第二次初始化相同,而且它将更难实现,因为我需要跟踪有用条目的停止位置。

有什么建议吗?提前谢谢。

在用典型用例分析代码之前,您不知道内存碎片是否是一个问题。除非mn之前非常小,否则我认为它根本不会成为瓶颈,因为您仍然可以进行大部分顺序内存访问。

如果您想避免它,您可以使用reserve而不是resize,或者使用m对象进行初始化。它只会分配内存,而不会产生构建不使用的对象的开销,从而提高初始化速度。

此外,矢量的reserve容量可能只消耗虚拟内存,而不是"真实"内存,直到你有效地使用它

如果你知道内部向量大小的分布,使用平均值作为默认长度,这可能有助于减少内存浪费。

无论如何,std::list在空间上是一个更大的浪费,考虑到碎片化,情况会更糟。

也许resize函数会对您有所帮助。请参阅此处了解详细信息。