假设我使用的是int a:
的向量vector<int> a {1, 2, 34, 1222, 0};
然后,我想推送一些像这样的数据:
a.push_back (data);
但是,我的程序必须在我的载体上添加大量数据。
我在书上学习c ++。该书说:“添加元素有时可能需要额外的存储空间。在这种情况下,每个元素都必须移动到新的存储中”,c ++ Ressources Network补充说“就处理时间而言,这是一项相对昂贵的任务。 ”。我还找到了关于这个主题的article。
但是,我的程序必须非常快。所以,我不能处理我的矢量的“重新定位”。事实上,我的矢量大小可以超过1GO的内存。
我的问题很简单:
如何在重新定位我的巨型矢量之前知道剩余的内存?
注意:我不知道我的矢量的最终大小,所以我无法初始化它,保留必要的内存。
如果您有任何问题或意见,请告诉我。
答案 0 :(得分:2)
std::vector
有针对此案例的方法:
capacity()返回为其分配内存的当前元素数。因此,如果向量中的元素数量超过此数量,则会重新分配
reserve()为给定数量的元素分配内存。如果给定的数字小于capacity()
,则它什么都不做。否则,它会重新分配以提供所需的容量。
答案 1 :(得分:2)
如果您知道vector
最终会有多大,那么您可以使用std::vector::reserve
来避免重新分配,但您说这是不可能的。
vector::push_back
保证摊销不变。它通过分配比它需要的更多内存来实现这一点。随着vector
变大,重新分配的次数会越来越少。 vector
专为此而设计,因此我建议您先尝试一下,然后衡量效果,看看重新分配是否有问题。
答案 2 :(得分:0)
...或者你可以使用我的再生储备矢量技巧: speeding vector push_back ......?