一. 引言
在演算法以及資料結構的實現中,很多地方我們都需要佇列(遵循FIFO,先進先出原則)。
為了使用佇列,我們可以自己用陣列來實現佇列,但自己寫太麻煩不說,並且還很容易出錯。
好在C++的STL(標準模板庫)為我們實現了一個強大的佇列,它包含在標頭檔案<queue>中。
二. queue
a) 建構函式
下面用例子來展示queue的建構函式
deque<int> deck(3,100); list<int> mylist(2,100); queue<int> first;//預設構造 queue<int,list<int> > second(mylist);//以list為容器構造 queue<int> third(mylist);//以deque為容器構造,其中deque是queue的預設容器 queue<int,deque<int> > forth(mylist);//用預設容器構造,deque是queue的預設容器
我們可以使用deque(雙端佇列容器)或者list(連結串列容器)來作為queue的基礎容器(underlying container,即佇列是在基礎容器的基礎上實現的),其中deque是預設使用的,如果沒有在引數中特殊指定,那麼queue就使用deque作為基礎容器。
b) 其他成員函式
- empty 測試容器是否為空,為空時返回true
- size 返回容器的大小
- front 返回佇列的第一個元素,即最早被壓進佇列的元素
- back 返回佇列的最後一個元素,即最晚被壓進佇列的元素
- push 把元素新增至佇列尾
- pop 彈出佇列首元素
- swap(C++11) 交換兩個佇列
- emplace(C++11) 在容器中直接構造元素,可以參考C++11新特性emplace操作
三. priority_queue(優先佇列)
a) 建構函式
1 #include <cstdio> 2 #include <queue> 3 #include <cstdlib> 4 #include <iostream> 5 #include <ctime> 6 #include <functional> 7 using namespace std; 8 struct Node{ 9 int a ; 10 Node(int a):a(a){} 11 }; 12 struct mycomparision{ 13 bool reverse; 14 mycomparision(const bool &revparam=false){ 15 reverse = revparam; 16 } 17 bool operator () (const int & lhs, const int &rhs) const { 18 if(reverse)return (lhs > rhs);//升序 19 else return (lhs < rhs);//降序 20 } 21 }; 22 struct cmp{ 23 bool operator () (const Node a, const Node b) const{ 24 return a.a < b.a;//小於號代表降序輸出 25 } 26 }; 27 int main(){ 28 int myints[] = {10,60,50,20}; 29 priority_queue<int> zero; 30 priority_queue<Node,vector<Node>,cmp> first;//自定義結構體的優先佇列,降序輸出 31 for(int c : myints){ 32 first.push(Node(c)); 33 } 34 priority_queue<int,vector<int>,mycomparision> second(myints,myints+4,mycomparision(true));//與自定義的仿函式mycomparision結合實現自定義排序功能 35 priority_queue<int,vector<int>,mycomparision> third(myints,myints+4,mycomparision()); 36 priority_queue<int,vector<int>,mycomparision> forth(myints,myints+4);//輸出結果同third 37 priority_queue<int,vector<int>,less<int>> fifth(myints,myints+4);//結果同third,less使佇列優先輸出小數,此為預設,即less<int>可以省略 38 priority_queue<int,vector<int>,greater<int>> sixth(myints,myints+4);//使用functional庫中的仿函式greater使佇列優先輸出小數 39 while(!first.empty()){ 40 cout << first.top().a << " "; 41 first.pop(); 42 } 43 cout << endl; 44 while(!second.empty()){ 45 cout << second.top() << " "; 46 second.pop(); 47 } 48 cout << endl; 49 while(!third.empty()){ 50 cout << third.top() << " "; 51 third.pop(); 52 } 53 cout << endl; 54 while(!forth.empty()){ 55 cout << forth.top() << " "; 56 forth.pop(); 57 } 58 cout << endl; 59 while(!fifth.empty()){ 60 cout << fifth.top() << " "; 61 fifth.pop(); 62 } 63 cout << endl; 64 while(!sixth.empty()){ 65 cout << sixth.top() << " "; 66 sixth.pop(); 67 } 68 return 0; 69 }
優先佇列內部維持了堆。利用堆來實現隨機的
我們可以使用deque(雙端佇列容器)或者vector(向量容器)來作為priority_queue的基礎容器,其中vector是預設使用的,如果沒有在引數中特殊指定,那麼queue就使用vector作為基礎容器。
這裡還要特別注意仿函式的使用。在標頭檔案<functional>提供了一部分仿函式,我們可以利用這些仿函式來實現對基本資料型別的升序降序操作。但對於自定義的結構體型別,我們需要自己額外來實現仿函式來進行排序。有關仿函式的概念可以參考部落格:【C++ STL】深入解析神祕的 --- 仿函式
b) 其他成員函式
priority_queue的成員函式與queue大體一致,其中需要注意的是:
- top取代了原來的front,每次取特定排序規則中的具有最值的元素
- 取消了back函式
以上是我自己查資料總結的佇列的一些用法,如有不對之處還望各位斧正。