那么本篇文章是带大家一起实现一下数据结构vector,那么我们现在就进入正题。
目录
接口介绍部分
增加
尾插
指定插入与头插
删除
尾删
指定位置删除
主要代码逻辑
增加
尾插
指定插入与头插
删除
尾删
指定位置删除
一些其他接口的代码逻辑
模拟实现过程中的经典bug
案例一
案例二
案例三
接口介绍部分
增加
尾插
尾插的参数列表只有一个,就是需要插入的值。
指定插入与头插
由于vector没有专用的头插接口,因此与指定插入的几口一致。
下图是比较常用的一种,也是我们今天要用的一种,那么它的参数列表是指定的位置和插入的值,而头插则是把指定位置设置为0即可
删除
尾删
从下图中,我们可以看到,它的参数列表中没有任何参数
指定位置删除
第一种是指定位置删除
第二种是区间删除,原则是左闭右开
主要代码逻辑
增加
尾插
代码解释:判断空间是否有剩余,并且在空间充足的情况下插入x,并且++finish;
指定插入与头插
代码解释:在保证指定位置合法的情况下,除判断空间是否有剩余外,建议需要更新一下pos,因为有时候可能会导致迭代器失效等问题的出现,并且在空间充足的情况下从后往前依次后移,直到腾出pos,插入x,并且++finish;
删除
尾删
代码解释:声明不为空,在--finish
指定位置删除
代码解释:还是一样的,我们先声明指定的位置必须合法,通过循环,从前往后,将后面的值挪动到前面一个位置,,最后--finish
一些其他接口的代码逻辑
迭代器的begin()和end()
代码疑惑点:首先这两个类型最后返回的是数组中的元素,因此类型要用自定义的iterator
拓展
size和capacity的计算
判空函数
模拟实现过程中的经典bug
案例一
代码状况:
解决方案:
案例二
解决方案:
在命名空间内且在类外添加void test_vector();的函数声明
案例三
问题所在:
finish空指针
解决方案:
使用旧的size
总结:
1. 纯属教学意义,有助于了解底层和前面知识学习后的实践,无实践意义
2. 在三个文件中都会出现的函数,需要在相同的命名空间内且位于类外位置进行声明
那么本期文章就先到这,我们下期见