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的值划算!

posted @ 2019-06-19 19:21  Royzzzzz  阅读(489)  评论(0编辑  收藏  举报