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扩容函数的一些理解的主要内容,如果未能解决你的问题,请参考以下文章