C++中vector容器为什么扩容时按照2倍或者1.5倍进行扩容

本文探讨了C++中vector容器在不同编译器环境下(VS2013与GCC)的扩容策略,主要集中在1.5倍和2倍扩容的原因。通过对扩容次数的分析,解释了为何使用倍数而非个数增长,并讨论了为何选择1.5倍或2倍而不是更高倍数的原因,涉及空间利用率和内存重用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

扩容机制

首先在VS2013底下,vector的扩容操作是每次扩容*1.5;在GCC环境下是2倍。

  • GCC下的扩容方式是以二倍形式扩容。
    在这里插入图片描述
  • VS2013下是以1.5倍进行扩容
    在这里插入图片描述
    所以可能会有疑问:
  • 问题一:为什么非要以倍数的形式增长,而不是以个数的形式增长。
  • 问题二:为什么每次增长是1.5倍或者2倍形式,而不是3倍或者4倍形式增长。
详解问题一
倍数方式空间拷贝数据次数

假设总共有n个元素,以m倍的形式增长。(比如现在举例n=100, m=2),所以,vector的push_back的操作次数可以是logmN,也就是log2(100),换算下来大概是需要进行7次扩容。这样的话,相当于旧空间数据到原空间数据的拷贝有7次。

个数方式空间拷贝数据次数

和倍数方式假设相同,n=100;这次m代表的是每次新空间的大小位n+m;m为新空间新增大小,比如这次m为10(每次新增10个空间)。所以这次的扩容次数为 100/10 = 10次,也就是说,插入100白个元素,需要扩容10次。
但是,如果n=1000的情况下, 以个数形式进行扩容就不能在为10了,否则拷贝空间次数将会太多
有的小伙伴要问:但是可以取100呀,想想,如果n=10的情况下,取100又不太合适,所以,以个数的形式来进行扩容显然不符合所用n的取值。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值