SGI STL Insert方法追加分析

在上一篇的分析中, 我们看了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里面的构造方法,没有数据类型参数的就不会调用构造方法,只会在分配空间。



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值