初始化矢量矢量

时间:2013-07-07 11:54:36

标签: c++ vector stl nested

我正在使用

vector<vector<size_t>> Ar;

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

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

Ar(n);

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

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

但这是超级慢和大量浪费内存,因为大多数条目都不会被使用。

我用

成功实现了这一点
vector<list<size_t> > Ar(n);

没有遭受碎片,但它比使用嵌套向量运行得慢得多。由于与上面的第二次初始化相同的原因,诸如Boost :: multi_array之类的固定表示将占用太多空间,并且实现起来将更加困难,因为我需要跟踪有用条目停止的位置。 / p>

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

2 个答案:

答案 0 :(得分:1)

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

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

此外,向量的reserve容量可能只消耗虚拟内存,而不是“真实”内存,直到您有效地使用它。

如果您知道内部向量大小的分布,请使用平均值作为默认长度,它可以帮助您减少内存浪费。

无论如何,考虑到碎片化,std::list在太空中的浪费更大,而且更糟糕。

答案 1 :(得分:0)

也许resize功能会对您有所帮助。有关详细信息,请参阅here