泛读《STL源码剖析》第四章:序列式容器之vector

vector概述

由于array 是静态空间,一旦配置了就不能改变;要换个大(或小)一点的空间需要客端自己执行很多细节:配置新空间,然后将元素从旧址搬往新址,再把原来的空间释还给系统,比较麻烦

因此,vector的设计对内存的利用和灵活性有比较大的提升

vector定义摘要

欲使用 vector 须先含入 <vector>头文件 ,但 SGI STL 将 vector 实作于更底层的 <stl_vector.h>

vector源代码摘录

泛读《STL源码剖析》第四章:序列式容器之vector

泛读《STL源码剖析》第四章:序列式容器之vector泛读《STL源码剖析》第四章:序列式容器之vector

泛读《STL源码剖析》第四章:序列式容器之vector

vector的迭代器

vector 维护的是一个连续线性空间,所以不论其元素型别为何,原生指标都可以做为 vector 的迭代器而满足所有必要条件

泛读《STL源码剖析》第四章:序列式容器之vector

泛读《STL源码剖析》第四章:序列式容器之vector

vector的数据结构

泛读《STL源码剖析》第四章:序列式容器之vector

示意图

泛读《STL源码剖析》第四章:序列式容器之vector

vector的构造与内存管理:constructor,push_back

constructor

泛读《STL源码剖析》第四章:序列式容器之vector

泛读《STL源码剖析》第四章:序列式容器之vector

从上面的图片可以看出:

构造函数调用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变大。如果没有备用空间了,就扩充空间(重新配置、搬移数据、释放原空间)

泛读《STL源码剖析》第四章:序列式容器之vector

泛读《STL源码剖析》第四章:序列式容器之vector

泛读《STL源码剖析》第四章:序列式容器之vector

所谓动态增加大小,并不是在原空间之后接续新空间(因为无法保证原空间之后尚有可供配置的空间),而是以原大小的两倍另外配置一块较大空间,然后将原内容拷贝过来,然后才开始在原内容之后建构新元素,并释放原空间。因此,对 vector 的任何操作,一旦引起空间重新配置,指向原 vector 的所有迭代器就都失效了

vector 的元素操作: pop_back, erase, clear, insert

pop_back

泛读《STL源码剖析》第四章:序列式容器之vector

erase

1

泛读《STL源码剖析》第四章:序列式容器之vector

泛读《STL源码剖析》第四章:序列式容器之vector

2

泛读《STL源码剖析》第四章:序列式容器之vector

图示

泛读《STL源码剖析》第四章:序列式容器之vector

clear

泛读《STL源码剖析》第四章:序列式容器之vector

insert

泛读《STL源码剖析》第四章:序列式容器之vector

泛读《STL源码剖析》第四章:序列式容器之vector

泛读《STL源码剖析》第四章:序列式容器之vector

图示

泛读《STL源码剖析》第四章:序列式容器之vector

泛读《STL源码剖析》第四章:序列式容器之vector

泛读《STL源码剖析》第四章:序列式容器之vector

end