C++複習(三):STL庫之deque、stack、queue、priority_queue容器

本文主要參考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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章