vector的扩容机制—为何是1.5倍或者是2倍

文章目录

  • 前言
  • 一、Vector 扩容过程
  • 二、为什么是1.5倍或者2倍?


前言

在 C++ 编程中,Vector 是一种常用的动态数组容器。其大小是可以动态调整的,而在扩容操作中,Vector 通常会将容量增加为原来的两倍。本篇博客将详细介绍 Vector 扩容的原理、扩容过程,并解释为何选择两倍进行扩容。

一、Vector 扩容过程

当向vector中插入元素时,如果元素有效个数size与空间容量capacity相等时,vector内部会触发扩容机制
扩容的过程是:开辟新空间->拷贝旧空间的元素->释放旧空间

每次扩容新空间不能太大,也不能太小,太大容易造成空间浪费,太小则会导致频繁扩容而影响程序效。

二、为什么是1.5倍或者2倍?

如果新空间大小为旧空间大小+1,也就是边插入边扩容,这样每一次插入都要进行拷贝,时间复杂度为O(n),效率非常低下。

如果新空间大小为旧空间大小+k,其中k是一个固定的增量,那么在每次扩容时,新空间的大小会增加k个单位。假设原始空间大小为n,进行m次扩容后,新空间的大小为n + m*k。平摊下来每次插入的时间复杂度还是O(n),效率非常低下。
vector的扩容机制—为何是1.5倍或者是2倍_第1张图片
以倍数方式进行扩容
假设有n个元素需要像vector插入,倍增因子为m,则完成n个元素像vector的push_back操作需要扩容log以m为低n的次方。比如:以二倍方式扩容,当向vector插入1000个元素,需要扩容log以2为底1000次方,就是扩容10次,第i次增容会把m的i次方个元素搬移到新空间,n次push_back的总操作次数为:
vector的扩容机制—为何是1.5倍或者是2倍_第2张图片
一般m取1.5或2。取1.5的时候每次扩容时可以重用之前释放的内存,而取2的时候扩容时不能重用之前释放的内存,解释如下:
使用2倍(k=2)扩容机制扩容时,每次扩容后的新内存大小必定大于前面的总和。
而使用1.5倍(k=1.5)扩容时,在几次扩展以后,可以重用之前的内存空间了。
vector的扩容机制—为何是1.5倍或者是2倍_第3张图片

为什么m不取3或4或者更大呢?因为如果倍数超过2倍(包含2倍)方式扩容会存在:①空间浪费可能会比较高,比如:扩容后申请了64个空间,但只存了33个元素,有接近一半的空间没有使用。②无法使用到前面已释放的内存。

参考

你可能感兴趣的:(开发语言,c++,面试)