1. vector如何进行扩容
当插入元素时,如果size == capacity
,触发扩容机制。
- 拷贝元素
- 释放旧空间
2. 如何避免扩容导致效率低
在插入前,预估好vector的容量,通常使用reserve
。如果没有reserve,边插边扩容,效率很低。
3. 为什么以倍数方式扩容
1. 以定长增长
* 每次的新空间是capacity + k
* 假设插入100个元素,k=10,需要扩容10次。每次扩容都需要把之前的拷贝一次,销毁一次。假设元素插入与元素搬移为1个单位操作,则n个元素push_back()总操作次数为
2. 以倍数方式扩容
* 假设有n个元素需要像vector插入,倍增因子为m,则完成n个元素像vector的push_back操作需要扩容log以m为低n的次方。比如:以二倍方式扩容,当向vector插入1000个元素,需要扩容log以2为底1000次方,就是扩容10次,第i次增容会把m的i次方个元素搬移到新空间,n次push_back的总操作次数为O(1):
4. 为什么选择1.5倍或2倍方式扩容,而不是3,4倍
- 2倍扩容:
- 扩容的大小依次为1,2,4,8。当第4次扩容时,需要8个大小的内存,此时只释放了1+2=3个内存,无法复用已释放的内存。
- 1.5倍扩容:
- 扩容大小依次为2,3,4,6,9。第5次扩容时,需要9个大小内存,此时释放了2+3+4=9个内存,可以复用已释放的内存
- 倍数超过2倍:
* 空间浪费
* 无法使用前面已释放的内存 - linux下是2倍扩容,vs下是1.5倍扩容