Vector容器操作与内存分配

本文探讨了C++中Vector容器的使用,强调其动态增长带来的内存分配和对象move操作对效率的影响。当pushback、resize等操作导致capacity变化时,Vector会进行内存重分配,导致迭代器失效。Vector的扩张倍数通常为2,以平衡空间和时间消耗。尽管clear函数可以清空元素,但不会释放内存。释放Vector空间的方法是通过swap与一个空的vector进行交换,达到回收内存的效果。
摘要由CSDN通过智能技术生成

Vector差不多是我用得最多的容器,原因嘛当然办为他好用了,动态数组的感觉用起来很方便。

但这种方便是有代价的,不然为什么还需要定长数组呢。

Vector的动态增长需要重新分配内存,然后将原有数据move过去,这其中有对象的构造、析构等等,这是vector主要的效率损耗。(迭代器失效的锅,内存重新分配也要背,内存变了,所有指针相关的全部失效)

所以vector和数组扩张、容易减少相关的所有操作,都会经历重新分配内存和move数据的过程。
比如,pushback导致capacity变化(使超过现有的容量),或者resize导致capacity变化(仅限增加capacity的值)。

vector的扩张倍数为2,为什么不为1不为3?其实这一点没有标准,不过是不同的分配策略而已,扩张倍数为2,保证每次分配比前面的总和还大一点点,虽然前面分配的内存无法复用,但是因为更高的容量就更少的扩充。如果是2-1这一阶段,可以利用之前分配的内存,但是因为更少的容量,可能要更多的扩充。扩张耗时,分配内存耗空间。
这是一个空间消耗与时间消耗的问题。
这种对比,他们之前的差异是非常小的,扩充次数和浪费空间都是常数级。由于本来就没有标准,所以其实2或是1.5什么的实现都有,看谁实现的而已。

值得注意的一点是,vector的内存空间是只增不减的,所以如果erase了所有对象,要释放这些空间怎么做呢?vector提供了一个clear函数,清空了元素,但是size=0不代表capacity等于0,也就是说内存空间其实是没有释放的。

如果vector不能通过erase&

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值