11.C++ STL之deque

一、容器deque結構

是雙向開口的空間。
而vector是單向的,已知vector的內存擴充是二倍成長。那麼deque怎麼擴充呢?

雙向擴充!

deque的方式是使用分段,然後將各段串接在一起。
在這裏插入圖片描述

map是個vector,其中每個元素是指針,指向每個分段,以將每個分段串接在一起。因此map是個T**類型

如果隊列末尾滿了,需要再分配一個buffer,並且在map後面中存入指向他的指針。

deque的迭代器iterator是一個class,內部有四個成員:cur,first,last,node

  • node:指向控制中心map,迭代器可以知道控制中心在哪,當迭代器需要++或者–的時候,就能通過它回到控制中心以跳到另一個分段。
  • last:某個buffer的尾(標識緩衝區的邊界)
  • first:某個buffer的頭(標識緩衝區的邊界)
  • cur:迭代器的任務是指向某一個元素,cur是在某個緩衝區中迭代器指向的元素。

只有cur纔會變動。
當跳到下一個緩衝區buffer,這四個成員都會發生變動。

  • start:begin(),返回這個成員
  • finish:end(),返回這個成員
template <class T,class Ref,class Ptr,size_t BufSize>
struct  __deque_iterator
{
	T* cur;
	T* first;
	T* last;
	map_pointer node;//T**
}

template <class T,class Alloc=alloc,size_t BufSize=0>
class deque{
//所謂buffer size是指每個buffer容納的元素個數
public:
	typedef T value_tyep;
	typedef __deque_iterator<T,T&,T*,BufSiz> iterator;
protected:
	typedef pointer* map_pointer;//T**
protected:
	iterator start;//16字節
	iterator finish;//16字節
	map_pointer map;//4字節
	size_type map_size;//4字節
	//16*2+4*2=32+8=40字節 一個deque創建出來40字節
public:
	iterator begin(){return start;}
	iterator end(){return finish;}
	size_type size()const {return finish-start;}
...
};
//如果n不爲0,傳回n,表示buffer size由使用者自定
//如果n爲0,表示buffer size使用預設值,那麼
//如果sz (sizeof(value_type))小於512,傳回512/sz
//如果sz不小於512,傳回1
inline size_t __deque_buf_size(size_t n,size_t sz)
{
	return n!=0?n:(sz<512?size_t(512/sz):size_t(1));
}

deque的insert函數

由於deque的特殊結構,在插入的時候會進行判斷,是往前推還是往後腿,因爲deque是雙向的。
如果10000個元素,在第4個位置插入,那麼前3個元素往前推一個位置。

deque如何模擬連續空間?

在這裏插入圖片描述在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章