STL中序列式容器之三deque

2021-06-18 00:45:58 字數 2972 閱讀 4862

1.deque概述

vector是單向開口的連續線性空間,而deque則是一種雙向開口的連續線性空間。所謂雙向開口,意思是可以在頭尾兩端都可以做元素的插入與刪除操作。vector當然也可以在頭尾兩端進行操作(從技術觀點),但是其頭部操作其差,無法被接受。

deque和vector的最大差異,一在於deque允許於常數時間內對起頭端進行元素的插入或移除操作,二在於deque沒有所謂容量(capacity)觀念,因為它是動態地以分段連續空間組合而成,隨時可以增加一段新的時間並鏈結起來。

2.deque的成員函式

函式描述

c.assign(beg,end)

c.assign(n,elem) 

將[beg; end)區間中的資料賦值給c。

將n個elem的拷貝賦值給c。

c.at(idx) 

傳回索引idx所指的資料,如果idx越界,丟擲out_of_range。

c.back() 

傳回最後乙個資料,不檢查這個資料是否存在。

c.begin() 

傳回迭代器重的可乙個資料。

c.clear() 

移除容器中所有資料。

dequec

dequec1(c2)

dequec(n)

dequec(n, elem)

dequec(beg,end)

c.~deque() 

建立乙個空的deque。

複製乙個deque。

建立乙個deque,含有n個資料,資料均已預設構造產生。

建立乙個含有n個elem拷貝的deque。

建立乙個以[beg;end)區間的deque。

銷毀所有資料,釋放記憶體。

c.empty() 

判斷容器是否為空。

c.end() 

指向迭代器中的最後乙個資料位址。

c.erase(pos)

c.erase(beg,end) 

刪除pos位置的資料,傳回下乙個資料的位置。

刪除[beg,end)區間的資料,傳回下乙個資料的位置。

c.front() 

傳回地乙個資料。

get_allocator 

使用建構函式返回乙個拷貝。

c.insert(pos,elem) 

c.insert(pos,n,elem)

c.insert(pos,beg,end)

在pos位置插入乙個elem拷貝,傳回新資料位置。

在pos位置插入》n個elem資料。無返回值。

在pos位置插入在[beg,end)區間的資料。無返回值。

c.max_size() 

返回容器中最大資料的數量。

c.pop_back() 

刪除最後乙個資料。

c.pop_front() 

刪除頭部資料。

c.push_back(elem) 

在尾部加入乙個資料。

c.push_front(elem) 

在頭部插入乙個資料。

c.rbegin() 

傳回乙個逆向佇列的第乙個資料。

c.rend() 

傳回乙個逆向佇列的最後乙個資料的下乙個位置。

c.resize(num) 

重新指定佇列的長度。

c.size() 

返回容器中實際資料的個數。

c1.swap(c2) 

swap(c1,c2)

將c1和c2元素互換。

同上操作。

3.deque的設計模式

deque是連續線性空間,連續線性空間總令我們聯想到array或vector,array不支援大小動態增長,而vector雖支援動態增長,但只能在尾端增長,而且其所謂的動態增加只是一種假象,事實上是(1)申請空間(2)資料移動(3)釋放原空間,因此,vector的效率在有些情況下也非常低。

deque是由一段段連續的線性空間組成的。一旦有必要在deque的前端或者尾端增加新空間時,配置一段連續的線性空間將它串聯在deque的頭端或者尾端。所以deque的最大任務是維持這些一段段連續的線性空間整體連續的假象。

deque採用一塊所謂的map(ps.不是stl中的map容器)作為主控。這裡所謂的map容器就是一小塊連續的線性空間,其中每個元素都是指標,指向另一塊線性連續的區域,叫做緩衝區。緩衝區才是deque的儲存空間的主體,**結構如下:

template

class deque;

4.deque的迭代器

deque是分段連續空間,為了維持deque整體連續的假象的任務,落在了迭代器operator ++和operator --的身上。deque必須掌握管控中心map以判斷自己是否處於快取區的邊緣,如果是,一旦前進或者後退就可以跳轉到上乙個或者下乙個快取區。

template

struct _deque_iterator;

在deque中保持著兩個迭代器start和finish,迭代器start內的cur指標當然指向緩衝區的第乙個元素,迭代器finish內的cur指標當然指向緩衝區內的最後元素(的下乙個位置)。下面是迭代器的幾個關鍵行為。由於迭代器內對各種指標運算都進行了過載操作,其中最關鍵的就是:一旦行進時遇到緩衝區邊緣,可能需要呼叫set_node()跳乙個緩衝區:

void set_node(map_pointer new_node)

在operator++ 或operator--都考慮了到達緩衝區邊緣的情況,如下:

self& operator ++()

return *this;

}5.deque的資料結構

deque除了維護乙個先前說過的指向map的指標外,也維護start,finish兩個迭代器,分別指向第乙個緩衝區的第乙個元素和最後乙個緩衝區的最後乙個元素的(下乙個位置)。當然,它必須記住當前的map的大小。因為一旦map所提供的的節點不足,就必須重新配置一塊更大的map。

template

class deque

iterator end()

,,,,,,,,,,

};

《STL原始碼剖析》之三 序列式容器

談到程式設計,大家首推的可能就是資料結構與演算法,幾乎任何特定的資料結構都是為了實現某種特定的演算法。在stl中將運用最廣的一些資料結構實現出來,比如 array 陣列 list 鍊錶 tree 樹 stack 棧 queue 佇列 hash table 雜湊表 set 集合 map 對映表 等等。...

STL 序列式容器細節

stl 序列式容器細節 一 概論 1 序列式容器 array build in c 內建 vector heap內含乙個vector priority queue內含乙個heap list slist deque stack內含乙個deque queue內含乙個deque 2 關聯式容器 rb tr...

STL序列式容器 heap

stl heap主要有以下幾種操作組成 make heap,建堆 sort heap,堆排序 pop heap,取出堆頂元素 push heap,調整堆 heap並不歸屬於stl容器元件,它是個幕後英雄,扮演priority queue的助手。binary max heap適合作為priority ...