vector模拟实现(13)

目录

1、vector深度剖析

2、vector模拟实现

1、成员变量

2、简单框架

1、无参的构造函数

2、push_back

3、operator[ ]

4、测试

3、迭代器

4、扩容函数

1、reserve

2、resize

5、析构函数

6、拷贝构造

1、支持迭代器区间初始化的构造函数

2、拷贝构造的现代写法

7、赋值重载(现代写法)

8、swap函数

9、函数模板的模板参数要传迭代器区间时,命名规范:

10、pop_back

11、insert

1、迭代器失效

12、erase

13、memcpy问题


1、vector深度剖析

2、vector模拟实现

1、成员变量

为了跟stl底层vector的实现一致,这里定义了3个的迭代器,其实就是原生指针:

2、简单框架

1、无参的构造函数

2、push_back

注意:

也可以提前算size(),例如:

3、operator[ ]

const版本:

4、测试

3、迭代器

迭代器遍历与范围for:

4、扩容函数

1、reserve

有了reserve,push_back就可以改为:

2、resize

注意:内置类型有构造函数的,int j=int();int k=int(10);不过一般不会这么写,因为模板的出现,所以C++对内置类型进行了升级。

匿名对象可以看作跟临时对象类似,常属性不能被修改,要加const。

const引用的匿名对象生命周期会延长。

5、析构函数

6、拷贝构造

1、支持迭代器区间初始化的构造函数

2、拷贝构造的现代写法

7、赋值重载(现代写法)

8、swap函数

因为上述重复写了swap函数,可以自己写一个swap函数

所以上述两个代码可以改为:

9、函数模板的模板参数要传迭代器区间时,命名规范:

10、pop_back

11、insert

稍有不注意,写出下列代码,就错了

原因:问题出在扩容上,reserve本身没问题,是扩容之后,pos位置失效,解决办法就是更新pos

虽然里面的pos更新了,因为是传值,外面的pos还是失效的,所以insert有返回值,返回一个新的迭代器,stl中的vector里的insert也是这样的原理,也有返回值

注意:不能传引用,在一些场景中会出问题,例如:const迭代器

上述是测试insert的代码样例,里面的find是算法中的,支持传迭代器区间

1、迭代器失效

例如上述,当迭代器变为野指针或失去意义,称为迭代器失效。

vector的迭代器失效主要发生在insert/erase中

12、erase

erase这里也有坑,下列代码大部分场景是删不干净的,有甚者,会崩溃

如果给出样例1 2 3 4 5 6,要求删除偶数,程序直接崩溃,因为最后一个是偶数,会导致erase以后,it的意义变了,再++一下,使it和end判断错过,这个问题通过返回值解决:

13、memcpy问题

当下述代码的注释取消时,程序运行直接崩溃

进入调试,当空间不够扩容时,push_back调reserve,reserve中的memcpy出问题:

所以不能用memcpy,应改为:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值