重定位向量c ++之前的剩余内存

时间:2018-04-19 08:40:20

标签: c++

假设我使用的是int a:

的向量
vector<int> a {1, 2, 34, 1222, 0};

然后,我想推送一些像这样的数据:

a.push_back (data);

但是,我的程序必须在我的载体上添加大量数据。

我在书上学习c ++。该书说:“添加元素有时可能需要额外的存储空间。在这种情况下,每个元素都必须移动到新的存储中”,c ++ Ressources Network补充说“就处理时间而言,这是一项相对昂贵的任务。 ”。我还找到了关于这个主题的article

但是,我的程序必须非常快。所以,我不能处理我的矢量的“重新定位”。事实上,我的矢量大小可以超过1GO的内存。

我的问题很简单:

如何在重新定位我的巨型矢量之前知道剩余的内存?

注意:我不知道我的矢量的最终大小,所以我无法初始化它,保留必要的内存。

如果您有任何问题或意见,请告诉我。

3 个答案:

答案 0 :(得分:2)

std::vector有针对此案例的方法:

capacity()返回为其分配内存的当前元素数。因此,如果向量中的元素数量超过此数量,则会重新分配

reserve()为给定数量的元素分配内存。如果给定的数字小于capacity(),则它什么都不做。否则,它会重新分配以提供所需的容量。

答案 1 :(得分:2)

如果您知道vector最终会有多大,那么您可以使用std::vector::reserve来避免重新分配,但您说这是不可能的。

vector::push_back保证摊销不变。它通过分配比它需要的更多内存来实现这一点。随着vector变大,重新分配的次数会越来越少。 vector专为此而设计,因此我建议您先尝试一下,然后衡量效果,看看重新分配是否有问题。

答案 2 :(得分:0)

...或者你可以使用我的再生储备矢量技巧: speeding vector push_back ......?