stl剖析之deque


/*******************************************************************************************

vector:单向开口的连续空间

deque:双向开口的连续性空间,即可以再头尾两端分别做元素的插入和删除。

两者差异:

deque允许常熟时间对起头端进行插入或者删除或移除操作,且没有所谓容量观念,因为它是动态的分段空间组合合成

因而deque没有必要保留空间。对于deque进行sort时候,可将deque完整的复制到一个vector中,然后排序后复制到deque

它的本质是什么?就是一个个小的空间连在一起 看起来如同连续的一个空间!

********************************************************************************************

那今天小雷同学就来分享一下我的见解。

个人认为,迭代器的核心就在于它是如何将空间连上?以及它是如何开辟空间的?以及它的模型是什么?

首先先看下它的整体模型:

解释:首先定义两个迭代器!一个负责pop_back,一个负责pop_front.然后开辟空间 空间一分为二!中间由_last指向。

然后起始位置就是_First(last的)指向 ,

next(last的)负责指向开辟空间中的元素位置。

_map指向中控器(就是两个int**的那个东西)。

de(队列):中的_Map直接指向中控器。

这样分析的话,双端队列其本身只负责控制中控器就可以了,而中控器(指向空间的结点)中负责指向一段空间。

迭代器负责判断、插入等一系列操作,当迭代器发现其空间不足了,那么将指向换向下一个结点。已有的空间还不足

那么,将原有的增大两倍,然后将原有的拷贝到新增的大的空间!最后释放空间!

注:deque的机理,每次拷贝或者插入值时,总会前后都预留一些空间,代码中我会注释

**********************************************************************************************************************

void push_back(const _Ty& _X)//这里是尾插定义
		{
		if (empty() || (_Last._Next == _Last._Last)) //判断空间是否为空
        {
            _Buyback(); 
            allocator.construct(_Last._Next++, _X);
        }
        else if (_Last._Next + 1 == _Last._Last)//判断空间是否到达末尾
        {
            allocator.construct(_Last._Next++, _X);
            _Buyback();
        }
        else
            allocator.construct(_Last._Next++, _X);
        ++_Size; }		

void _Buyback()
		{_Tptr _P = allocator.allocate(_DEQUESIZ, (void *)0);
		if (empty())
			{_Mapsize = _DEQUEMAPSIZ;
			size_type _N = _Mapsize / 2;
			_Getmap();
			_Setptr(_Map + _N, _P);
			_First = iterator(_P + _DEQUESIZ / 2, _Map + _N);
			_Last = _First; }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值