C++ STL容器deque和vector很類(lèi)似,也是采用動(dòng)態(tài)數(shù)組來(lái)管理元素,。
使用deque之前需包含頭文件:
#include <deque>
它是定義在命名空間std內(nèi)的一個(gè)class template:
template<class _Ty,
class _Ax = allocator<_Ty> >
class deque;
第一個(gè)template參數(shù)用來(lái)表示元素型別,,第二個(gè)可有可無(wú),指定內(nèi)存模型,。一般使用默認(rèn)的內(nèi)存模型,。
與vector不同的是deque的動(dòng)態(tài)數(shù)組首尾都開(kāi)放,因此能夠在首尾進(jìn)行快速地插入和刪除操作,。
deque的邏輯結(jié)構(gòu):
deque的內(nèi)部結(jié)構(gòu)
deque是一種優(yōu)化了的對(duì)序列兩端元素進(jìn)行添加和刪除操作的基本序列容器,。通常由一些獨(dú)立的區(qū)塊組成,第一區(qū)塊朝某方向擴(kuò)展,,最后一個(gè)區(qū)塊朝另一方向擴(kuò)展,。它允許較為快速地隨機(jī)訪問(wèn)但它不像vector一樣把所有對(duì)象保存在一個(gè)連續(xù)的內(nèi)存塊,而是多個(gè)連續(xù)的內(nèi)存塊,。并且在一個(gè)映射結(jié)構(gòu)中保存對(duì)這些塊以及順序的跟蹤,。
其內(nèi)部結(jié)構(gòu)如下圖所示:
deque的特點(diǎn):
1、支持隨機(jī)訪問(wèn),,即支持[]以及at(),,但是性能沒(méi)有vector好。
2,、可以在內(nèi)部進(jìn)行插入和刪除操作,,但性能不及l(fā)ist。
deque和vector的不同之處:
1,、兩端都能夠快速插入和刪除元素。vector只能在尾端進(jìn)行,。
2,、deque的元素存取和迭代器操作會(huì)稍微慢一些。因?yàn)閐eque的內(nèi)部結(jié)構(gòu)會(huì)多一個(gè)間接過(guò)程,。
3,、迭代器是特殊的智能指針,而不是一般指針。它需要在不同的區(qū)塊之間跳轉(zhuǎn),。
4,、deque可以包含更多的元素,其max_size可能更大,。因?yàn)椴恢故褂靡粔K內(nèi)存,。
5、不支持對(duì)容量和內(nèi)存分配時(shí)機(jī)的控制,。
注意:在除了首尾兩端的其他地方插入和刪除元素,,都將會(huì)導(dǎo)致指向deque元素的任何pointers、references,、iterators失效,。不過(guò),deque的內(nèi)存重分配優(yōu)于vector,。因?yàn)槠鋬?nèi)部結(jié)構(gòu)顯示不需要復(fù)制所有元素,。
6、deque的內(nèi)存區(qū)塊不再被使用時(shí),,會(huì)被釋放,。deque的內(nèi)存大小是可縮減的。不過(guò),,是不是這么做以及怎么做由實(shí)作版本定義,。
deque和vector相似的特性:
1、在中間部分插入和刪除元素相對(duì)較慢,,因?yàn)樗性囟家灰苿?dòng),。
2、迭代器屬于隨即存取迭代器,。
最好采用deque的情形:
1,、需要在兩端插入和刪除元素。
2,、無(wú)需引用容器內(nèi)的元素,。
3、要求容器釋放不再使用的元素,。
deque的操作函數(shù)
構(gòu)造函數(shù)和析構(gòu)函數(shù):