我正在使用
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>
有什么建议吗?提前谢谢。
答案 0 :(得分:1)
在您使用典型用例分析代码之前,您不知道内存碎片是否存在问题。
除非m
前n
非常小,否则我认为它根本不会成为瓶颈,因为您仍然主要进行顺序内存访问。
如果您还想避免使用它,可以使用reserve
代替resize
或使用m
对象进行初始化。它只会分配内存,而不会构造不会使用的对象的开销,从而提高初始化速度。
此外,向量的reserve
容量可能只消耗虚拟内存,而不是“真实”内存,直到您有效地使用它。
如果您知道内部向量大小的分布,请使用平均值作为默认长度,它可以帮助您减少内存浪费。
无论如何,考虑到碎片化,std::list
在太空中的浪费更大,而且更糟糕。
答案 1 :(得分:0)
也许resize
功能会对您有所帮助。有关详细信息,请参阅here。