研究STL之vector的push_back函数解析

本文探讨了STL vector的push_back函数的工作机制,包括如何在已有空间充足和不足时插入元素,以及在空间不足时如何重新分配和移动数据。分析了为何在不同情况下选择复制构造函数和赋值运算符,强调了效率和异常安全性。
摘要由CSDN通过智能技术生成

         突然对vector的push_back好奇,于是看了一下vector的源码,做了以下总结。技术水平不行,写作水平更不行,没空画图。大家看看指出错误。

        1、如果有足够空闲的申请的空间,直接插入到最后,调用了通用的一个函数Fill,插入数目是N(N==1)。插入过程是,先备份起始插入地址P,备份地址是B,循环N次,选一段空间M,对这段空间执行元素的Placement New的复制构造函数,成功后,P后移,如果构造过程有异常,则从B到P的元素全部反构造,反构造方法就是调用析构函数。成功执行Fill后,返回一个指针作为vector的元素后界限,即vector::end()这个迭代器对应的位置。想想为什么要复制构造?在一块未用过的空间定义对象要让空间变为有效,就得构造,复制构造的方式是复制数据到未用过的空间最直接的方式,难不成用空构造,再赋值?
        2、如果发现空闲的申请的空间不够,调用Insert到最后,Insert会自动增涨空间,Insert就在指定位置I插入N(N==1)个元素。Insert在调试模式下会检查插入位置I的迭代器的容器是不是自己,有没有越界(指插入位置不是vector::begin()的vector::end()闭区间),有就报错。这里把传入的Val用本地变量通过复制构造复制了一份,原因,后面会进行数据的移动,万一Val本身就是vector的一个元素,移数据后Val就无效了。Insert发现N是0就直接不管了,发现插入数据后会超出所允许用的容量,就报错。 

        要插入数据了,这时有三

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值