文章目录
- vector 容器实现与扩充
- 1. 底层实现
- 2. 扩容过程
- size() 和 capacity()
- 扩容机制
vector 容器实现与扩充
1. 底层实现
Vector在堆中分配了一段连续的内存空间来存放元素
三个迭代器
- first: 指向的是vector中对象的起始字节位置
- last:指向的是当前最后一个元素的末尾字节
- end:指向整个vector容器所占用内存空间的末尾字节
- last - first:表示vector容器汇总目前已被使用的内存空间
- end - last:表示vector 容器目前空闲的内存空间
- end - first:表示vector容器的容量
2. 扩容过程
如果集合已满,在新增数据时,就需要分配一块更大的内存,将原来的数据复制过去,再插入新增的元素。
所以对vector的任何操作,一旦引起空间重新配置,指向原有vector 的所有迭代器就都失效了。
size() 和 capacity()
(1)堆中分配内存,元素连续存放,内存空间只会增加不会减小
vector有两个函数,一个是capacity()
,在不分配新内存的情况下最多可以保存的元素的个数,另一个是size()
返回当前已经存储的数据的个数。
(2)对于vector来说,capacity()
是永远大于等于size()
的
capacity() == size()
时,vector就会扩容(capacity翻倍)
扩容机制
- 固定扩容
机制:
每次扩容的时候在原有capacity基础上加上固定的容量
缺点:
考虑一种极端情况,vector每次添加的元素数量刚好等于每次扩容后增加的容量+1, 就会造成一种情况,每添加一次就需要扩容一次,而每次扩容花费的时间十分高昂,所以固定扩容就会面临多次扩容时间复杂度极高的情况。
优点:
固定扩容方式空间利用率较高 - 加倍扩容
机制:
每次扩容capacity翻倍
优点:
加倍扩容情况下需要扩容的次数较少,时间复杂度较低
缺点:
空间利用率较低
在实际过程中,通常采用空间换时间的方式。
- resize 和 reserve()
resize(): 改变当前容器内含有元素的数量(size()),而不是容器的容量
1. 当`resize(len)`中`len() > v.capacity() `,则数组中的size和capacity均设置为len;
2. 当`resize(len)`中`len <= v.vapacity()`时,则数组中的size设置为len,而capacity不变。
reserve(): 改变当前容器的 最大容量(capacity)
1. 如果`reserve(len)`中`len > capacity()`, 那么会重新分配一块能存len个对象的空间,然后把之前的数据通过`copy_constructor`复制过来,并销毁之前的内存;
2. 如果`reserve(len)`中`len <= capacity()`,则数组中的capacity不变,size不变,即不对容器进行任何改变。