vector扩容

本文探讨了C++中STL vector的扩容原理,当vector空间不足时,它会申请新空间并拷贝原有内容。由于内存重新分配,这可能导致迭代器失效。不同的编译器如VS和G++有不同的扩容因子,VS采用1.5,G++使用2。文章对比了两种扩容因子的优缺点,指出1.5可能更优,因为它能更好地利用内存并减少频繁分配。

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

扩容原理

  • vector以连续的数组存放数据,当vector空间已满时会申请新的空间并将原容器中的内容拷贝到新空间中,并销毁原容器
  • 存储空间的重新分配会导致迭代器失效
  • 因为分配空间后需要进行拷贝,编译器会预分配更多空间以减少发生拷贝影响程序效率
  • 扩容的大小叫做扩容因子,扩容因子由编译器决定,VS的扩容因子为1.5,G++中,扩容因子为2
	vector<int> v = { 1,2,3,4,5,6 };
	cout << v.capacity()<<' ';
	v.push_back(7);
	cout << v.capacity();

vs中,扩容后容器大小为原来的1.5倍
在这里插入图片描述
g++中,扩容后容器大小为原来的2倍
在这里插入图片描述

不同扩容因子的比较

  • 扩容因子大,每次需要分配的新内存空间越多,分配空间耗时。空闲空间较多,内存利用率低。
  • 扩容因子小,需要再分配的可能性更高,扩容耗时。空闲空间较少,内存利用率较。

一般认为扩容因子1.5优于2.0,原因是以1.5作为扩容因子可以实现复用释放的内存空间。

以2为扩容因子时,分配空间为

0 1 2 4 8 16...

每次分配新空间时所需空间与释放的空闲空间

分配空间空闲空间
10
21
41+2=3
83+4=7
167+8=15

空闲的空间始终要小于需要分配的空间

以1.5为扩容因子时,分配空间为

0 1 2 3 4 6 9...
分配空间空闲空间
10
21
31+2=3
43+3=6
66+4=10
910+6=16

随着分配空间增大,之前释放的空闲空间能够满足当次扩容所需的空间,实现内存的复用

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值