vector模拟实现
vector默认构造函数
一. 在c++中vector容器就相当于数据结构中的顺序表,所以需要定义三个成员变量分别为:T* _start , T* _finish , T* _end_of_storage三个指针,分别表示_start指向顺序表的首地址,_finish指向顺序表的尾地址,_end_of_storage指向当前顺序表的最大容量所在的地址。如下:
因为在容器中会用到迭代器,而暂时我们可以将迭代器理解成一个指针,所以就可以定义迭代器:
在c++中的vector中有语句
这里就是将v中的v.begin()到v.end()区间的值拷贝给v1容器具体代码如下:
注意这里在进行拷贝之前要先对三个指针进行初始化,如果不初始化就会导致野指针的错误。
而在上面提到的begin()和end()两个函数分别表示的是容器的首地址位置和容器的尾地址的下一个地址位置,所以这两个函数实现如下:
二. 拷贝构造
此处拷贝构造和之前的string类相差不二,因为此处拷贝的时候要进行深拷贝,如果不进行深拷贝就会导致两个指针指向一段空间,那么就会析构两次,所以此处拷贝的操作就是先对当前_start指针进行开空间,并且将值赋值给他,再更改_finish 和 _end_of_storage。具体代码如下:
三. 析构函数
此析构函数就是将_start开辟的空间还给内存,之后将三个指针都指向空。
运算符重载
一. 赋值运算符重载
传统写法:就是将当前对象进行扩容和赋值对象一样的空间,并且将值赋值给当前对象,返回当前对象。具体代码如下:
对于现代写法,和string类型一样可以使用swap交换算法,将当前对象和拷贝对象的三个指针都交换一下,这样就相当于将两个对象调换过来了具体代码如下:
二. [] 随机访问运算符重载
此运算符就是返回当前数组中的第t个位置的数值。
增删查改实现
一. 增操作
vector容器中insert操作就是在容器中的pos位置插入一个数据,如果当前容器满了就要对其进行扩容具体代码:
此处当容器满了需要扩容的时候要注意迭代器失效的问题,此处的迭代器失效就是当对_start指针进行新开空间的时候会将指针之前指向的旧地址进行回收,此时就会使pos指针指向一段不知名的地址,也就是变成了野指针。所以此时在扩容之前要对其进行计算他之前的位置,在扩容之后对其进行恢复操作,这时就可以避免了迭代器失效的问题。
此处就是在容器尾进行插入数值。
二. 删操作
此处删除就是将后面的数据将前面要删除的元素进行覆盖,并改变_finish所指向的位置。具体代码如下:
三. 查操作
此处查操作其实就是将容器进行遍历一遍,如果找到就返回其所在的位置,如果没有就返回-1。
四. 改操作
此处的改操作和string的改操作是差不多的,也就是resize和reserve操作
其中resize就是将vector容器中的元素个数进行增加和减小,如果是增加要判断是否比最大容量还大,如果大的话就要进行扩容,不大的话就在_finish之后的空间赋值,并将_finish进行修改。具体代码如下:
其中reserve操作也就是扩容操作,就是改变_end_of_storage指针所指向的地址,具体操作就是将_start指向新开辟的空间,并将值赋值给新开辟的空间并将就空间给删除掉,并将_end_of_storage指针进行修改。具体代码如下: