vector模板类实现

文章介绍了对vector作为动态数组的理解,重点讨论了反向迭代器的实现原理,以及在vector中两种常见的迭代器失效情况:容器扩容和元素删除。作者提出了解决这些问题的策略,包括在扩容时更新迭代器和避免使用已删除位置的迭代器。
摘要由CSDN通过智能技术生成

       

目录

1.对于vector的理解

2.反向迭代器

3.迭代器失效


        在学习STL的过程中,我们需要对其中容器都进行实现的尝试,最近我也通过实现vector容器发现了其中的一些难点和易错点,给大家分享一下。

1.对于vector的理解

我对于vector的理解就是一个更加方便的数组,而且是一个能够扩容的数组,并且有着许多方便的成员函数供用户使用。

2.反向迭代器

迭代器是学习C++过程的一个非常方便的工具,在学习vector的过程中,我们可以认为vector的正向迭代器就是普通的指针。

那么对于反向迭代器,C++编译器是如何实现的呢?

在这里,编译器使用了库中的适配器进行反向迭代器的生成,所谓适配器,其实就是一个名字叫做

reverse_iterator的类模板,他可以对传入的正向迭代器进行处理,从而生成反向迭代器,对于很多结构都是适用的,大大提高了代码的复用程度。

这里截取反向迭代器类的开头部分给大家观看

 其中,需要注意的是,为了使反向迭代器时也能够像使用正向迭代器一样,使用左闭右开的的结构,对于反向迭代器的解引用,我们并不是对当前位置进行解引用,而是对当前位置的下一个位置进行解引用,源码如下:

 

3.迭代器失效

迭代器失效是在STL中容器模拟时经常会出现的问题,这里我主要讲讲vector中常见的迭代器失效。

(1)容器扩容造成的迭代器失效

在vector中,当vector容量已满时,再继续添加元素的操作,就会自动对于容器进行扩容,如果我们再使用扩容前的迭代器,就相当于使用野指针,会造成空间泄露。

例如,在insert函数中

以下是insert函数的定义

 如果我们实现vector时,对于insert函数没有考虑扩容的情况,就有可能造成野指针的问题,而且是有可能,并不是一定,因为我们无法预料容器何时扩容,因此我们可以使用一个len先记录插入位置距离起始位置的距离,扩容后再对插入位置进行更新,我的解决方案如下:

 (2)位置删除造成的迭代器失效

这个问题相对简单,我举个例子,请看下列代码

 大家看,如果我事先保存了vector的末尾位置,然后我对末尾位置进行了删除,此时末尾位置已经不在我们的控制范围了,再去使用it不就是纯纯的越界行为吗!

以上就是本人在实现vector模板类时遇到的一些困难,感谢大家观看!

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值