1. 概述
Vector维护的是一个连续的线性空间,有三个比较重要的指针,start指向目前使用空间的头,finish指向目前使用空间的尾,end_of_storage指向目前可用空间的尾。增加新元素的时候,如果备用空间不够,会将容量扩容到两倍。会经历“重新配置,元素移动,释放原空间”等过程,因此,扩容的时候效率会比较低,还需注意扩容后外部代码保存的iterator指针指向的还是旧的节点指针。
内存结构如下图:
2. 优缺点
2.1 优点
· 维护一段连续的内存,类似数组,但可以进行动态操作。
· 随机访问方便,支持[]操作符和vector.at()
2.2 缺点
· 在内部进行插入删除操作效率低
· 当动态添加的数据超过vector默认分配的大小时要进行整体的重新分配,拷贝和释放
3.主要方法
3.1 pop_back
// 将尾端元素拿掉,并调整大小
void pop_back(){
--finish; //将尾端元素指针前移一格,表示丢弃尾端元素
destroy(finish); //进行释放
}
3.2 erase
// 清除[first,last)中的所有元素
iterator erase(iterator first, iterator last){
iterator i = copy(last, finish, first); // 将last到finish的内存拷贝至first起始处
destroy(i, finish);
finish = finish - (last - first);
return first;
}
3.3 insert
insert方法在插入时,会判断当前备用空间是否充足,不足的时候会进行扩容,并将插入节点前后的数据分别拷贝至对应区域,然后填充要插入的数据。