c++ stl vector为什么两倍扩容?如何释放内存?

要解释为什么要两倍扩容我们可以分两步理解?

1.为什么选择成倍扩容,而不是成等差扩容?

(1)我们假设我们使用m扩容,一共有n个元素,那么我们需要扩展多少次才能装下这n个元素,通过计算我们可以得到:m^{x} = n \Rightarrow x=log_{m}n,那么我们需要拷贝多少个元素呢?

\sum_{i=1}^{log_{m}n} m^{i} \approx \tfrac{nm}{m+1}

这个式子可以看出来总的时间复杂度为n,当平均分摊到每个元素上,时间复杂度为常数。

(2)我们假设使用每次增加一个固定的常数m来扩容,总的元素个数是n,那么我们需要扩展多少次才能装下这n个元素,通过计算我们可以得到:mx = n\Rightarrow x = \tfrac{n}{m},,那么我们需要拷贝多少个元素呢?

\sum_{i=1}^{\tfrac{n}{m}}= mi

这个式子可以看出总的时间复杂度为n^{2},当平均分摊到每个元素上,时间复杂度为n。

综上所述,我们可以知道我们应该选择的是成倍扩容,而不是成一个固定数扩容。

2.为什么我们要选择2倍扩容(gcc)或者1.5倍扩容?

首先我们可以明确的是,我们的扩容倍数一定是大于1的,因为装不下才需要扩容。

那么它的上限是多少呢?

我们通过排列的知识可以知道,当扩容 的倍数为2的时候,那么这个扩容容量总是大于之前所有的扩容总和:

\sum_{i=0}^{n}2^{i} = 2^{n+1}-1 < 2^{n+1}

这样的话,之前扩容的空间不能使用,这样对缓存并不友好。因此选定的倍数应该是1到2

中间,选择1.5的原因应该是:不至于太浪费内存空间,同时也不需要太多次的赋值数组内容。

3.如何释放?

vector的内存空间只增不减,vector内存的回收只能靠vector调用析构函数的时候才被系统收回,当然也可以使用swap来帮你释放内存,具体方法:

vec.swap(vec);

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值