深入理解 C++ vector 源码与迭代器失效问题
平时包的头文件vector.h就是图上

平时包的vector内部也是包着其他头文件的,除了核心还有其他文件的原因是有时候在vector内部可能会用内存池等等,所以包了这些头文件(内存池就实现在alloc的头文件),而construct头文件就是用来辅助内存池的,内部实现了构造析构等函数来初始化等等,内存池只开空间并不初始化,释放的时候也不清理空间

在这里插入图片描述
下面是对vector.h这个核心的头文件的核心内容的梳理

在这里插入图片描述
二、vector的模拟实现
2.1 using关键字的新语法
typedef还有一个新语法,在C++14加入进来的,如图:

在这里插入图片描述
using除了可以用来展开命名空间,还可以用来重定义(C++有很多地方会复用同一个关键字),using在这里的功能和typedef的功能是一样的:using iterator = T* ; 是类型别名的定义,作用是将 iterator 定义为 T*(T 类型的指针)的别名。
在这个模板类 vector< T > 中,这样定义后:
- 当 T 是 int 时,iterator 就等价于 int* ;
- 当 T 是 double 时,iterator 就等价于 double*;
2.2 迭代器+构造+扩容+尾插
这里迭代器我是使用原生指针来实现的,实际上的例如vector,list的迭代器是用一个类来封装的,因为这里的模拟实现只是实现一个百分之70的底层逻辑,实现一个百分百一摸一样的太复杂了,但是迭代器的底层肯定是和指针有着千丝万缕的关系的
这里没有做声明和定义分离是因为模板不能分离定义到两个文件,分离定义到两个文件会导致链接错误

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
这里对程序进行运行然而却发生了报错

在这里插入图片描述通过调试可以发现_finish在这里被赋值后居然还是空指针,end_of_storage是没有问题的00变为10,且_start没有问题,那么必然是size()出现问题了,这里size()内_start是新空间的_start(不为0),而_finish没有更新,依旧是旧空间的_finish(为0),所以相减肯定会出问题,size()中_finish - _start;应该为0才对(此时只是开了4个空间,一个数据都没有)
更多推荐




所有评论(0)