正在初始化矢量
Initializing vector vector
我正在使用
vector<vector<size_t>> Ar;
结构。结构的内容随时间变化,特别是每个嵌套向量的长度是随机的,并且随时间变化。顺序很重要,如果嵌套向量为空,我不能忽略它。我知道嵌套向量(比如m)和外部向量(比如n)的最大容量。
我在正确初始化时遇到了一些困难。如果我使用
Ar(n);
没有问题,但我最终得到了内存碎片,因为分配器不知道嵌套向量的大小。如果可能的话,我希望避免这种情况,因为我不知道随着我试图处理的数据大小的增加,它会产生什么影响。我试图通过提前固定嵌套向量的长度来获得紧凑的表示来绕过碎片,但我在这方面遇到了困难。我使用
Ar(n,vector<size_t>(m));
但这是非常慢的,并且是对内存的巨大浪费,因为大多数条目都不会被使用。
我已经用成功地实现了这一点
vector<list<size_t> > Ar(n);
不会出现碎片,但它的运行速度比使用嵌套向量慢得多。像Boost::multi_array这样的固定表示会占用太多空间,原因与上面的第二次初始化相同,而且它将更难实现,因为我需要跟踪有用条目的停止位置。
有什么建议吗?提前谢谢。
在用典型用例分析代码之前,您不知道内存碎片是否是一个问题。除非m
在n
之前非常小,否则我认为它根本不会成为瓶颈,因为您仍然可以进行大部分顺序内存访问。
如果您想避免它,您可以使用reserve
而不是resize
,或者使用m
对象进行初始化。它只会分配内存,而不会产生构建不使用的对象的开销,从而提高初始化速度。
此外,矢量的reserve
容量可能只消耗虚拟内存,而不是"真实"内存,直到你有效地使用它
如果你知道内部向量大小的分布,使用平均值作为默认长度,这可能有助于减少内存浪费。
无论如何,std::list
在空间上是一个更大的浪费,考虑到碎片化,情况会更糟。
也许resize
函数会对您有所帮助。请参阅此处了解详细信息。
- 是否可以初始化不可复制类型的成员变量(或基类)
- C++使用整数的压缩数组初始化对象
- C++初始化基类
- 多成员Constexpr结构初始化
- 复制列表初始化的隐式转换的等级是多少
- 内联映射初始化的动态atexit析构函数崩溃
- 如何在C++中初始化嵌套类中的2个memeber
- 如何声明特征矩阵,然后通过嵌套循环初始化它
- 没有用于初始化C++中的变量模板的匹配构造函数
- 在未初始化映射的情况下,将值插入到映射的映射中
- C++成员初始化
- 为什么在C++中首先初始化成员类
- 同时具有"聚合初始化"和"模板推导"
- 初始化具有非默认构造函数的std::数组项的更好方法
- 是否可以在编译时初始化数组,以便在运行时不会花费时间?
- 我可以使用条件运算符初始化C风格的字符串文字吗
- 在C和C++中初始化结构中的数组
- 标准是否使用多余的大括号(例如 T{{{10}}})定义列表初始化?
- 在函数内部的声明中初始化数组,并在外部使用它
- 继承:构造函数,初始化C++11中基类的类C数组成员