C++学习笔记 —— vector是如何增长的(实现原理)

规定

string和vector实现一样。
为了支持快速随机访问,vector中对象在内存中必须是连续存储的

问题1

但是vector又是可变大小的。所以当vector空间用完了的时候,我们不能将元素添加到其他位置,因为vector必须连续存储才能保证快速随机访问。

解决1

所以vector策略是:开辟新的更大的连续空间,将vector中原来的元素移动到新空间,然后释放旧空间。

问题2

但是有出现问题:如果我们每添加一个元素,就做一次这样的移动数据到新内存操作,又释放旧内存,这样操作太频繁,并且性能肯定非常差。

解决2

所以标准库使用能够减少空间分配次数的策略——预先分配策略
vector会先分配一个比需求更大的空间,作为预留。
vector有几个属性
v.size()表示当前已有元素数量
v.capacity() 表示vector实际总容量,因为有预留空间
v.reserver(n) 表示要求vector的容量是多少。如果大于capacity则vector扩容,如果小于capacity则不需要扩容。
举个例子:比如我每次给vector添加一个元素,当添加了24个元素时,size为24,这时capacity为32.这个capacity大小为标准库的实现策略来决定的。
也就是只要我们添加操作不超出capacity,我们的vector就不会频繁扩容,尽量减小对性能的影响。
每个vector都实现自己的内存分配策略,但是必须遵循一条就是:只有迫不得已的时候才分配新的空间。

再举个例子:当size大小为50时,这时capacity也是50。这时我们再增加一个元素,发现size为51,而capacity变为100.也就是这个策略是将原容量翻倍了。

总结

vector实现策略:

  1. vector可以扩容,开辟新的更大的连续空间,将vector中原来的元素移动到新空间,然后释放旧空间(保证元素在内存中连续)
  2. vector有个capacity作为预留容量,只有元素数量需求超过capacity的时候才对vector进行扩容,具体扩容策略由标准库决定:比如可以使用翻倍扩容。(目的是减少扩容次数,减少性能影响)。
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Charles Ray

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值