在上一篇的分析中, 我们看了Vector Insert方法,但是其中的copy_backward(__position, _M_finish - 2, _M_finish - 1);等算法因为没有做出详解,所以分析的不够透彻,接下来我们继续进行分析。
if (_M_finish != _M_end_of_storage) {
construct(_M_finish, *(_M_finish - 1));
++_M_finish;
_Tp __x_copy = __x;
copy_backward(__position, _M_finish - 2, _M_finish - 1);//就是将传递进来的值所指向的位置到_M_finish-2 的值全部Copy到_M_finish-1这个空间里面去
//这样就完成了插入值
*__position = __x_copy;//让构造出来的对象等于迭代器。
}
construct就不进行再次说明了,就是一个placement new。
接下来着重说明下insert方法中最为核心的地方,copy_backward在这个方法中所起到的作用以及图解内部指针在整个过程中的运作状态。
图为灵魂画法。
因为Insert在插入的过程中,需要将前面所有的元素都重新copy一份,所以花费了很多的资源,效率不高。
Insert方法有两个,接下来说说他们的区别。
void _M_insert_aux(iterator __position, const _Tp& __x);//传入了
void _M_insert_aux(iterator __position);
void _M_insert_aux(iterator __position, const _Tp& __x); 传入了数据类型参数的在重新很配空间的时候会去调用VectorBase里面的构造方法,没有数据类型参数的就不会调用构造方法,只会在分配空间。