/*******************************************************************************************
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; }