突然对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就直接不管了,发现插入数据后会超出所允许用的容量,就报错。
要插入数据了,这时有三