1.expan扩容函数的一些理解

Posted royzzzzz

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了1.expan扩容函数的一些理解相关的知识,希望对你有一定的参考价值。

1 template <typename T> void Vector<T>::expand()  //向量空间不足时扩容
2     if (_size < _capacity) return; //尚未满员时,不必扩容
3     if (_capacity < DEFAULT_CAPACITY) _capacity = DEFAULT_CAPACITY; //不低于最小容量
4     T* oldElem = _elem;  _elem = new T[_capacity <<= 1]; //容量加倍
5     for (int i = 0; i < _size; i++)
6        _elem[i] = oldElem[i]; //复制原向量内容(T为基本类型,或已重载赋值操作符‘=‘)
7     delete[] oldElem; //释放原空间
8 
9 

1.1.为什么选择加倍(两倍)扩容?而不是根据固定容量扩容?(在copyFrom函数中同理申请了双倍空间内存的理由)

这里涉及到了一个成本分摊的概念。

假设我们初始容量为0的vector插入n个元素,这个n个元素可以定义为n=m*I,插入了I次, 固定扩容容量变为m。

(1)如果我们选择根据每次插入的量扩大容量

则最坏的情况可以是每次插入m+1元素,则第1,I+1,2I+1...(m-1)I 次插入的时候扩容 ,这是一个算术级数,时间成本为O(n2),平均到每一次插入的成本应该是O(n)

(2)如果我们选择根据加倍扩容的办法

则最坏的情况可以是在第1,2,4,8,16...次插入时扩容,这是一个几何级数,时间成本为O(n),平均到每一次插入的成本为O(1)

显然,我们选择加倍扩容的办法,比去修改_capacity的值划算!

以上是关于1.expan扩容函数的一些理解的主要内容,如果未能解决你的问题,请参考以下文章

浅谈ArrayList的底层扩容的原理

Java HashMap的扩容

深入理解PlasmaPlasma 细节

深入理解PlasmaPlasma 细节

Go语言的匿名函数与闭包的一些理解

pandas一些常用函数的使用和理解