STL序列式容器之deque

2021-07-29 16:22:25 字數 3517 閱讀 3708

deque是一種雙向開口的連續線性空間,所謂雙向是指可以在首尾兩端進行插入和刪除,邏輯結構如圖所示:

deque和vector最大的差異在於deque可以在常數時間內對頭端進行插入和刪除操作,而且deque沒有容量的概念,隨時可以增加一段新的空間並鏈結起來。除非必要,應盡量使用vector而非deque。對deque進行排序操作為了提高效率可以先將deque複製到vector中,將vector排序後(利用stl sort演算法)再複製回deque。

deque由一段一段的定量連續空間構成,一旦有必要在deque的前端或者尾端增加新空間,便配置一定的連續空間,串接在整個deque的頭端或者尾端,deque最大的任務便是維護這些連續空間整體連續的假象,並提供隨機訪問的介面。deque採用map(非stl map)作為主控,這裡的map是一小段連續空間,每個元素都是乙個指標,指向另一段連續的線性空間,稱為緩衝區,緩衝區才是deque的儲存空間主體。sgi stl 允許指定緩衝區大小,預設值0表示將使用512bytes緩衝區。

deque的迭代器應該能夠指出分段連續空間在**,必須能夠判斷自己是否處在其所在緩衝區的邊緣,如果是則應能夠跳到下乙個或上乙個緩衝區上。其中控器、迭代器和緩衝區的關係如下圖。迭代器內的cur指標指向當前緩衝區的當前元素,first指向首元素,last指向尾元素,node回指此緩衝區迭代器在中控器中的位置。

對於乙個存放了23個元素的deque再加入乙個元素,其結構圖如下。start迭代器內含第乙個緩衝區指標資訊,finish迭代器內含最後乙個緩衝區資訊。deque::begin()傳回迭代器start,deque::end()傳回迭代器finish。

正因為deque內部的結構複雜,所以訪問元素時deque的內部多乙個間接過程,相比於vector會慢一點。deque迭代器需要在不同區塊之間跳轉,所以必須是智慧型指標。deque的迭代器屬於隨機訪問迭代器。

在標頭檔案中,class deque定義如下:

namespace

std

第乙個引數代表元素型別,帶有預設值的第二個引數定義deque記憶體模型,預設使用allocator。

1. 構造和析構函式操作

效果dequec

產生乙個存放elem型別元素的空deque

dequec1(c2)

針對某個deque產生乙個同型副本

dequec(n)

產生乙個含有n個元素,以default建構函式產生元素的deque

dequec(n,elem)

產生乙個含有n個elem元素deque

dequec(beg,end)

產生乙個以區間[beg,end]內元素為初值的deque

c.~deque()

銷毀所有元素,釋放記憶體

2. 非變動性操作操作

效果c.size()

返回實際容器的大小。

c.empty()

判斷容器大小是否為0。

c.max_size()

返回可容納元素最大數量

c1 == c2

判斷c1是否等於c2

c1 != c2

判斷c1是否不等於c2

c1 < c2

判斷c1是否小於c2

c1 > c2

判斷c1是否大於c2

c1 <= c2

判斷c1是否小於等於c2

c1 >= c2

判斷c1是否大於等於c2

c.at(idx)

返回索引位置idx處的元素,如果idx越界,丟擲out_of_range異常

c[idx]

返回索引位置idx處的元素,不進行範圍檢查

c.front()

返回第乙個元素,不檢查元素是否存在

c.back()

返回最後乙個元素,不檢查元素是否存在

c.begin()

返回乙個隨機訪問迭代器,指向第一元素

c.end()

返回乙個隨機訪問迭代器,指向最後乙個元素的下一位置

c.rbegin()

返回乙個逆向迭代器,指向逆向迭代時的第乙個元素

c.rend()

返回乙個逆向迭代器,指向逆向迭代時最後元素的下一位置

3. 變動性操作操作

效果c1 = c2

將c2的所有元素賦值給c1

c.assign(n,elem)

將n個elem副本賦值給c

c.assign(beg,end)

將區間[beg,end]中的元素賦值給c

c1.swap(c2)

將c1和c2中的元素互換

swap(c1,c2)

同上,此為全域性函式

c.insert(pos,elem)

在pos位置插入乙個elem副本,返回新元素的位置

c.insert(pos,n,elem)

在pos位置插入n個elem副本,無返回值

c.insert(pos,beg,end)

在pos位置插入區間[beg,end]內的元素,無返回值

c.push_back(elem)

在尾部新增乙個elem的副本

c.pop_back()

移除最後乙個元素,不回傳

c.push_front(elem)

在頭部插入乙個elem副本

c.pop_front()

移除頭部元素,不回傳

c.erase(pos)

移除pos位置上的元素,返回下一元素的位置

c.erase(beg,end)

移除區間[beg,end]內的元素,返回下一元素的位置

c.resize(num)

將大小改為num。如果size增長了,新增大小以default建構函式產生出來

c.resize(num,elem)

將大小改為num。如果size增長了,新增大小以elem副本產生出來

c.clear()

移除所有元素,將容器清空

deque的使用示例

//example of deque

#include

#include

#include

#include

using

namespace

std;

int main()

cout

<< endl;

coll.resize(4, "resized string");

copy(coll.begin(), coll.end(),

ostream_iterator(cout, "\n"));

return

0;}

輸出結果:

STL序列式容器之deque

deque概述 vector是單向開口的連續線性空間,deque則是一種雙向開口的連續線性空間。所謂雙向開口,意思是可以在頭尾兩端分別做元素的插入和刪除操作。vector當然也可以在頭尾兩端分別做元素的插入刪除操作 從技術上說 但是其頭部操作效率極差而無法被接受。deque和vector的最大差異,...

stl之序列容器 deque

相比於vector,deque是一種雙向開口的連續線性空間,可以在頭尾兩端分別做元素的插入和刪除操作。這也決定了其更賦值的容器結構。deque內部維護了start和finish 節點,用於雙端的插入和刪除 map,一塊連續空間,其每個元素都是個指標,指向乙個節點。其指向的節點中有四個元素 cur f...

STL學習筆記 序列式容器deque

上一次說了list,現在再看一下序列式容器的另外幾種,常用的stack,queue,還有乙個deque,這個我不常用,所以先看一下deque的用法 1.deque vector是單向開口的連續線性空間,list是不連續的空間,支援兩邊操作,deque是一種雙向開口的連續線性空間,支援兩邊操作。由於d...