目录
在学习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模板类时遇到的一些困难,感谢大家观看!