目录
1、vector深度剖析
2、vector模拟实现
1、成员变量
为了跟stl底层vector的实现一致,这里定义了3个的迭代器,其实就是原生指针:
2、简单框架
1、无参的构造函数
2、push_back
注意:
也可以提前算size(),例如:
3、operator[ ]
const版本:
4、测试
3、迭代器
迭代器遍历与范围for:
4、扩容函数
1、reserve
有了reserve,push_back就可以改为:
2、resize
注意:内置类型有构造函数的,int j=int();int k=int(10);不过一般不会这么写,因为模板的出现,所以C++对内置类型进行了升级。
匿名对象可以看作跟临时对象类似,常属性不能被修改,要加const。
const引用的匿名对象生命周期会延长。
5、析构函数
6、拷贝构造
1、支持迭代器区间初始化的构造函数
2、拷贝构造的现代写法
7、赋值重载(现代写法)
8、swap函数
因为上述重复写了swap函数,可以自己写一个swap函数
所以上述两个代码可以改为:
9、函数模板的模板参数要传迭代器区间时,命名规范:
10、pop_back
11、insert
稍有不注意,写出下列代码,就错了
原因:问题出在扩容上,reserve本身没问题,是扩容之后,pos位置失效,解决办法就是更新pos
虽然里面的pos更新了,因为是传值,外面的pos还是失效的,所以insert有返回值,返回一个新的迭代器,stl中的vector里的insert也是这样的原理,也有返回值
注意:不能传引用,在一些场景中会出问题,例如:const迭代器
上述是测试insert的代码样例,里面的find是算法中的,支持传迭代器区间
1、迭代器失效
例如上述,当迭代器变为野指针或失去意义,称为迭代器失效。
vector的迭代器失效主要发生在insert/erase中
12、erase
erase这里也有坑,下列代码大部分场景是删不干净的,有甚者,会崩溃
如果给出样例1 2 3 4 5 6,要求删除偶数,程序直接崩溃,因为最后一个是偶数,会导致erase以后,it的意义变了,再++一下,使it和end判断错过,这个问题通过返回值解决:
13、memcpy问题
当下述代码的注释取消时,程序运行直接崩溃
进入调试,当空间不够扩容时,push_back调reserve,reserve中的memcpy出问题:
所以不能用memcpy,应改为: