泛读《STL源码剖析》第四章:序列式容器之vector
vector概述
由于array 是静态空间,一旦配置了就不能改变;要换个大(或小)一点的空间需要客端自己执行很多细节:配置新空间,然后将元素从旧址搬往新址,再把原来的空间释还给系统,比较麻烦
因此,vector的设计对内存的利用和灵活性有比较大的提升
vector定义摘要
欲使用 vector 须先含入 <vector>头文件 ,但 SGI STL 将 vector 实作于更底层的 <stl_vector.h>
vector源代码摘录
vector的迭代器
vector 维护的是一个连续线性空间,所以不论其元素型别为何,原生指标都可以做为 vector 的迭代器而满足所有必要条件
vector的数据结构
示意图
vector的构造与内存管理:constructor,push_back
constructor
从上面的图片可以看出:
构造函数调用fill_initialize
fill_initialize调用allocate_and_fill
allocate_and_fill调用uninitialized_fill_n
uninitialized_fill_n() 根据第一参数的型别特性,决定使用算法 fill_n() 或反复呼叫 construct() 来完成任务
push_back
当我们以 push_back() 将新元素安插于 vector 尾端,该函式首先检查是否还有备用空间?如果有就直接在备用空间上建构元素,并调整迭代器 finish ,使 vector变大。如果没有备用空间了,就扩充空间(重新配置、搬移数据、释放原空间)
所谓动态增加大小,并不是在原空间之后接续新空间(因为无法保证原空间之后尚有可供配置的空间),而是以原大小的两倍另外配置一块较大空间,然后将原内容拷贝过来,然后才开始在原内容之后建构新元素,并释放原空间。因此,对 vector 的任何操作,一旦引起空间重新配置,指向原 vector 的所有迭代器就都失效了
vector 的元素操作: pop_back, erase, clear, insert
pop_back
erase
1
2
图示
clear
insert
图示
end