C++STL:熟悉vector的底层实现,部分源码解析,迭代器失效和深层次浅拷贝
.部分vector源码解析
在实现vector之前,我们先看看它的源码。很大部分我们都看不懂,直接看是看不懂的。所以主要看关键词和模块的功能,不追求每个都看懂。
看,vector里没啥东西,就单独包了些头文件。

扫一眼你就能发现,最重要的肯定是我画圈的两个头文件 。
其实最重要的是 stl_vector.h,最后一个头文件是用来实现vector<bool>的类型。
vector<bool>是 vector特化出来的类,是针对存储bool值的特化。这个类型单独提供一些接口,因为存bool值其实是用来标记的


接下来看源码。看不懂的不用看,只需要抓住主线去看:


第一张图是 typedef ,抓住主要几个核心的:
T value_type value_type* iterator size_t size_type
结合这两张图,我们就找到了vector底层的三个指针变量,看名字大概就能知道他们的作用,
我们猜测这就是核心的成员
它的迭代器是原生指针实现的。
接下来看它的构造函数:

这一块出现了很多 看似学过,但学的不多的函数,上面的几个简单函数还好,主要是中间的构造函数。 我们先了解第一个:通过查找源码发现以下:



如图,十分明显,这个最简单的构造和begin,end,capacity接口告诉我们,我们的猜测是正确的。

那这就是他们的用途,分别指向三个关键地方。
我们找找它的push_back,帮助我们理解源码:


下图中的 尾插 操作涉及 construct 函数,其实这个函数的作用(上图)是:利用定位new给finish位置初始化,因为底层是预先分配的原始内存,未初始化,没初始化那里就是随机值,直接尾插会导致未定义行为,必须利用构造函数初始化。
else,空间不足,肯定要扩容,那我们看看 inser_aux 的源码

它的参数是在pos位置插入x,不单单是尾插,那猜测insert也是调用这个函数。
为什么它还在检测空间是否足够?原因正如我们猜测:

insert也调用了insert_aux

对于insert_aux,可能有人有疑问,为什么这里要先把最后一个数据往后先构造,再赋值?
直接把 pos+1位置开始全部往后赋值一位,然后插入x不就行了吗?
原因一样,后面的空间都是随机值。如果是int这样的内置类型没事,但如果是string等,直接把最后一个数据往后赋值,可能导致未定义,因为是随机值,所以必须构造初始化,确保不会出问题。
更多推荐



所有评论(0)