要解释为什么要两倍扩容我们可以分两步理解?
1.为什么选择成倍扩容,而不是成等差扩容?
(1)我们假设我们使用m扩容,一共有n个元素,那么我们需要扩展多少次才能装下这n个元素,通过计算我们可以得到:,那么我们需要拷贝多少个元素呢?
这个式子可以看出来总的时间复杂度为n,当平均分摊到每个元素上,时间复杂度为常数。
(2)我们假设使用每次增加一个固定的常数m来扩容,总的元素个数是n,那么我们需要扩展多少次才能装下这n个元素,通过计算我们可以得到:,,那么我们需要拷贝多少个元素呢?
这个式子可以看出总的时间复杂度为,当平均分摊到每个元素上,时间复杂度为n。
综上所述,我们可以知道我们应该选择的是成倍扩容,而不是成一个固定数扩容。
2.为什么我们要选择2倍扩容(gcc)或者1.5倍扩容?
首先我们可以明确的是,我们的扩容倍数一定是大于1的,因为装不下才需要扩容。
那么它的上限是多少呢?
我们通过排列的知识可以知道,当扩容 的倍数为2的时候,那么这个扩容容量总是大于之前所有的扩容总和:
这样的话,之前扩容的空间不能使用,这样对缓存并不友好。因此选定的倍数应该是1到2
中间,选择1.5的原因应该是:不至于太浪费内存空间,同时也不需要太多次的赋值数组内容。
3.如何释放?
vector的内存空间只增不减,vector内存的回收只能靠vector调用析构函数的时候才被系统收回,当然也可以使用swap来帮你释放内存,具体方法:
vec.swap(vec);