C++ 學習筆記之 STL 佇列

deepwzh發表於2017-03-03

一.  引言

  在演算法以及資料結構的實現中,很多地方我們都需要佇列(遵循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)     其他成員函式

  1. empty 測試容器是否為空,為空時返回true
  2. size 返回容器的大小
  3. front 返回佇列的第一個元素,即最早被壓進佇列的元素
  4. back 返回佇列的最後一個元素,即最晚被壓進佇列的元素
  5. push 把元素新增至佇列尾
  6. pop 彈出佇列首元素
  7. swap(C++11) 交換兩個佇列
  8. 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大體一致,其中需要注意的是:

  1. top取代了原來的front,每次取特定排序規則中的具有最值的元素
  2. 取消了back函式

以上是我自己查資料總結的佇列的一些用法,如有不對之處還望各位斧正。

相關文章