本文主要參考https://blog.csdn.net/weixin_34128839/article/details/91686932
queue,stack是基於deque實現的,都是順序容器,支持隨機訪問。priority_queue是基於vector實現的,底層數據結構是堆。
list的本質是一個雙向鏈表,內存空間不連續,通過指針進行操作。
deque是一個double-ended queue,由多個連續內存塊構成,deque是list和vector的兼容,分爲多個塊,每一個塊大小是512字節,塊通過map塊管理,map塊裏保存每個塊得首地址。因此該容器也有索引操作operator[],效率沒vector高。另外,deque比vector多了push_front()和pop_front( )操作,在兩端進行此操作時與list的效率差不多。
1、構造和賦值
#include<iostream>
//#include<deque> stack和queue庫中都包含了deque
#include<stack>
#include<queue> //queue庫中包含了priority_queue
#include<string>
using namespace std;
//以下int,string等可替換成其他類型,若類型爲struct和class時可能還需考慮操作符重載
//deque的其他構造函數基本和vector一致。
deque<string> dq1(5, "hello"); //創建一個大小爲5、值均爲"hello"的deque
deque<int> dq2 = { 9,5,2,7 }; //創建一個deque並賦值{9,5,2,7}
//一般只會按如下方式創建,並且除dequeue外只能這麼創建
deque<int> dq3;
queue<int> q1; //創建一個空queue。不能加括號,會出問題。
stack<int> st1; //創建一個空stack。不能加括號,會出問題。
priority_queue<int> pr_q1; //創建一個空priority_queue。不能加括號,會出問題。默認大的元素優先級高。
priority_queue<int, vector<int>, greater<int>> pr_q2; //這樣寫,大的元素優先級高。和上一行是等同的定義。
priority_queue<int, vector<int>, greater<int>> pr_q3; //這樣寫,小的元素優先級高。
//下標賦值,但不建議這麼幹,畢竟是把它當隊列或棧用的
//dq2[1] = 6; //dq2值爲{9,6,2,7}
2、大小
一般不會用到,我們不怎麼關注隊列和棧的大小,我們只關注它是否爲空。
dq2.size() //返回dq2中元素的個數,即dq2的大小,應爲4。
dq2.max_size() //返回容器所能容納的最大元素數目。這是系統或者庫所實施的限制,但是容器不一定保證能達到該大小,有可能在還未達到該大小的時候,就已經無法繼續分配任何的空間了。這個函數似乎沒有什麼卵用。
4、進棧、出棧、進隊、出隊、獲得端點值
//dequeue,雙向隊列
dq3.push_back(2); //隊尾進隊。隊列值爲{2}
dq3.push_front(5); //隊頭進隊。隊列值爲{5,2}
dq3.back(); //返回隊尾元素值。應爲2
dq3.front(); //返回隊頭元素值。應爲5
dq3.pop_back(); //隊尾出隊。隊列值爲{5}
dq3.pop_front(); //隊頭出隊。隊列值爲{}
//queue,單向隊列
q1.push(2); //隊尾進隊。隊列值爲{2}
q1.push(5); //隊尾進隊。隊列值爲{2,5}
q1.back(); //返回隊尾元素。應爲5
q1.front(); //返回隊頭元素。應爲2
q1.pop(); //隊頭出隊。隊列值爲{5}
//stack,棧
st1.push(2); //進棧。棧值爲{2}
st1.push(5); //進棧。棧值爲{2,5}
st1.top(); //返回棧頂元素值。應爲5
st1.pop(); //出棧。棧值爲{2}
//priority_queue,優先級隊列
//優先級隊列默認爲最大堆,即以從大到小爲優先級順序,出隊的元素爲最大的元素。
pr_q1.push(2); //進隊。隊列值爲{2}
pr_q1.push(5); //進隊。隊列值爲{5,2}
pr_q1.push(3); //進隊。隊列值爲{5,3,2}
pr_q1.top(); //返回優先級最大的元素值。應爲5
pr_q1.pop(); //出隊。隊列值爲{3,2}
5、判斷是否爲空
dq2.empty(); //若爲空,則返回True,否則返回False。以下幾個同理
q1.empty();
st1.empty();
pr_q1.empty();
6、priority_queue的優先級設置
當隊列中元素爲int、string等可比較的元素時,可直接使用以上成員函數。
當隊列中元素爲struct,class等元素時,應重載比較函數,比如小於號操作符。具體細節可參考https://blog.csdn.net/hellokandy/article/details/81458663。