c++模拟实现数据结构之vector篇

那么本篇文章是带大家一起实现一下数据结构vector,那么我们现在就进入正题。

e80e0730ba854a0d95157cd45e6aa3ca.gif

目录

接口介绍部分

增加

尾插

指定插入与头插

删除

尾删

指定位置删除

主要代码逻辑

增加

尾插

指定插入与头插

删除

尾删

指定位置删除

一些其他接口的代码逻辑

模拟实现过程中的经典bug

案例一

案例二

案例三


接口介绍部分

增加

尾插

d97045f798744323b2db7f29e1ac8ae2.png

尾插的参数列表只有一个,就是需要插入的值。

指定插入与头插

由于vector没有专用的头插接口,因此与指定插入的几口一致。

下图是比较常用的一种,也是我们今天要用的一种,那么它的参数列表是指定的位置和插入的值,而头插则是把指定位置设置为0即可

d32f1e2cc83742f6915c106bed6e9758.png

删除

尾删

从下图中,我们可以看到,它的参数列表中没有任何参数

8d2dfa50874e489380f60ab34f82f066.png

指定位置删除

468012947cad46588e10d11377455590.png

第一种是指定位置删除

第二种是区间删除,原则是左闭右开

主要代码逻辑

增加

尾插

ee2192f6d65845538b5b62f9fb3403ed.png

代码解释:判断空间是否有剩余,并且在空间充足的情况下插入x,并且++finish;

指定插入与头插

ced4746b321d4ffe95b32cf912dc8873.png

代码解释:在保证指定位置合法的情况下,除判断空间是否有剩余外,建议需要更新一下pos,因为有时候可能会导致迭代器失效等问题的出现,并且在空间充足的情况下从后往前依次后移,直到腾出pos,插入x,并且++finish;

删除

尾删

ed87d8ca67ff4dc8b6d02f0458eedb69.png

代码解释:声明不为空,在--finish

指定位置删除

c9680de0bd6541d6b3925fd49013147c.png

代码解释:还是一样的,我们先声明指定的位置必须合法,通过循环,从前往后,将后面的值挪动到前面一个位置,,最后--finish

一些其他接口的代码逻辑

迭代器的begin()和end()

d0aaa85df72349a0a52fdd06d00d24c1.png

代码疑惑点:首先这两个类型最后返回的是数组中的元素,因此类型要用自定义的iterator

拓展

77fc91981f434ef9bf5ea683982d8601.png

size和capacity的计算

fd957082798a4709b60442672063d871.png

判空函数

743960a778aa4d699a57ec2156037580.png

模拟实现过程中的经典bug

案例一

d98ffc9facb946fc841e41ff626b2841.png

代码状况:

f1f9751acc0b42728d882c669f078355.png

解决方案:

3fbaa112df4d405295fa2be24beca08b.png

案例二

118ce49a82194b4ebfd9bb8aff4dd313.png

解决方案:

f39805c23a6147b68dc093cfeecb7b3c.png

在命名空间内且在类外添加void test_vector();的函数声明

案例三

53fe8da5474e4648b42c17db9c80acf6.png

问题所在:

5051659856484297846d1ba6f6031cbc.png

finish空指针

解决方案:

66695e9957ac4034b1349140356eb9ed.png

使用旧的size

总结:

1. 纯属教学意义,有助于了解底层和前面知识学习后的实践,无实践意义

2. 在三个文件中都会出现的函数,需要在相同的命名空间内且位于类外位置进行声明

那么本期文章就先到这,我们下期见

53058962739d4c39a4b364a83ae6959f.gif

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值