一、容器擴充卡
stack
queue
priority_queue
stack、queue、priority_queue 都不支援任一種疊代器,它們都是容器擴充卡類型,stack是用vector/deque/list對象建立了一個先進後出容器;queue是用deque或list對象建立了一個先進先出容器;priority_queue是用vector/deque建立了一個排序隊列,内部用二叉堆實作。
前面或多或少談到過list/vector的實作,而沒提到過deque的實作,可以用以下一句話概括,具體可以看看《stl源碼剖析》:
Storing contents in multiple smaller arrays, allocating additional arrays at the beginning or end as needed.
Indexing is implemented by keeping a dynamic array containing pointers to each of the smaller arrays.

(一)、stack
首先來看示例代碼:
再看stack 的源碼:
即有一個_Container 成員,預設是deque<_Ty> ,當然也可以傳遞vector, list 進去,隻要支援push_back,pop_back 等接口。内部的函數實作
都借助了容器的函數,跟以前實作過的Stack 很像。
(二)、queue
先來看示例代碼:
再來看queue 源碼:
實作跟stack 是很類似的,隻是queue不能用vector 實作,因為沒有pop_front 接口。
(三)、priority_queue
再來看priority_queue 的源碼:
priority_queue 的實作稍微複雜一點,可以傳遞3個參數,而且有兩個成員,comp 即自定義比較邏輯,預設是less<value_type>,在構造函數中
調用make_heap函數構造二叉堆,comp 主要是用于構造二叉堆時的判别,如果是less 則構造大堆,如果傳遞greater 則構造小堆.
注意,priority_queue 不能用list 實作,因為list 隻支援雙向疊代器,而不支援随機疊代器。
下面舉個例子說明make_heap 函數的用法:
輸出:
5 4 2 1 3
1 2 3 4 5
make_heap() 将容器的元素構造成二叉堆,傳遞的是less,即構造的是大堆,把大堆層序周遊的結果存入數組,再調用sort() 進行排序,内部調用
的實際算法不一定,可以是堆排序、插入排序、選擇排序等等,跟蹤進去發現調用的是插入排序;當然也可以直接指定使用堆排序 sort_heap(調用
者必須已經是堆了,也就是前面已經先調用了make_heap,而且大小堆類型得比對),與make_heap 一樣,第三個參數傳遞的都是函數對象的用
法。sort 和 sort_heap 預設都是從小到大排序,除非重載的版本傳遞了第三個參數,如下,第三個參數可以是函數指針,也可以是函數對象:
傳遞greater 構造的是小堆,如下圖所示:
參考:
C++ primer 第四版
Effective C++ 3rd
C++程式設計規範