C++中的隊列(queue)和優先隊列(priority_queue)總結

1. STL介紹

STL = Standard Template Library,標準模板庫,惠普實驗室開發的一系列軟件的統稱。它是由Alexander Stepanov、Meng Lee和David R Musser在惠普實驗室工作時所開發出來的。從根本上說,STL是一些“容器”的集合,這些“容器”有list,vector,set,map等,STL也是算法和其他一些組件的集合。這裏的“容器”和算法的集合指的是世界上很多聰明人很多年的傑作。STL的目的是標準化組件,這樣就不用重新開發,可以使用現成的組件。STL現在是C++的一部分,因此不用額外安裝什麼。
STL被內建在你的編譯系統之內。STL的版本很多,常見的有HP STL、PJ STL、 SGI STL等。
在C++標準中,STL被組織爲下面的17個頭文件:

<algorithm>、<deque>、<functional>、<iterator>、<array>、<vector>、<list>、<forward_list>、
<map>、<unordered_map>、<memory>、<numeric>、<queue>、<set>、<unordered_set>、<stack>和<utility>。

2.隊列queue

隊列是一種特殊的線性表,特殊之處在於它只允許在表的前端(front)進行刪除操作,而在表的後端(rear)進行插入操作,和棧一樣,隊列是一種操作受限制的線性表。進行插入操作的端稱爲隊尾,進行刪除操作的端稱爲隊頭。
隊列是一種特殊的線性表,特殊之處在於它只允許在表的前端(front)進行刪除操作,而在表的後端(rear)進行插入操作,和棧一樣,隊列是一種操作受限制的線性表。進行插入操作的端稱爲隊尾,進行刪除操作的端稱爲隊頭。隊列中沒有元素時,稱爲空隊列。
隊列的數據元素又稱爲隊列元素。在隊列中插入一個隊列元素稱爲入隊,從隊列中刪除一個隊列元素成爲出隊。因爲隊列只允許在一段插入,在另一端刪除,所以只有最早進入隊列的元素才能最先從隊列中刪除,故隊列又稱爲先進先出(FIFO—first in first out)線性表。

2.1隊列使用說明

queue模版類的定義在頭文件中。
queue與stack模版非常類似,queue模版也需要定義兩個模版參數,一個是元素類型,一個是容器類型,元素類型是必要的,容器類型是可選的,默認爲dqueue類型。
定義queue對象的示例代碼如下:
queueq1;
queueq2;
queue的基本操作有:
1.入隊:如q.push(x):將x元素接到隊列的末端;
2.出隊:如q.pop() 彈出隊列的第一個元素,並不會返回元素的值;
3,訪問隊首元素:如q.front()
4,訪問隊尾元素,如q.back();
5,訪問隊中的元素個數,如q.size();

3.優先隊列(priority_queue)

普通的隊列是一種先進先出的數據結構,元素在隊列尾追加,而從隊列頭刪除。在優先隊列中,元素被賦予優先級。當訪問元素時,具有最高優先級的元素最先刪除。優先隊列具有最高級先出 (largest-in,first-out)的行爲特徵。
首先函數在頭文件<queue> 中,歸屬於命名空間std,使用的時候需要注意。優先隊列有兩種常用的聲明方式:

std::priority_queue<T> pq;
std::priority_queue<T, std::vector<T>, cmp> pq;

第一種實現方式比較常用,下面給出STL中對應聲明的解釋:

template<typename _Tp, 
         typename _Sequence = vector<_Tp>,
typename _Compare  = less<typename _Sequence::value_type> >
class priority_queue

默認模板有三個參數,第一個是優先隊列處理的類,第二個參數比較有特點,是容納優先隊列的容器。實際上,優先隊列是由這個容器+C語言中關於heap的相關操作實現的。這個容器默認是vector,也可以是dequeue,因爲後者功能更強大,而性能相對於vector較差,考慮到包裝在優先隊列後,後者功能並不能很好發揮,所以一般選擇vector來做這個容器。第三個參數比較重要,支持一個比較結構,默認是less,默認情況下,會選擇第一個參數決定的類的<運算符來做這個比較函數,,所以我們用的時候需要進行重載運算符。

3.1 priority_queue常用函數介紹

(1) empty() 如果優先隊列爲空,則返回真
(2) pop() 刪除第一個元素
(3) push() 加入一個元素
(4) size() 返回優先隊列中擁有的元素的個數
(5) top() 返回優先隊列中有最高優先級的元素

3.2實例

我們聲明一個類:

class T 
{ 
public: 
    char ch;
    int z; 
    T(char a, int b):ch(a), z(b){} 
}; 

按z大小進行輸出:

/********************************************************
1.empty() 如果優先隊列爲空,則返回真
2.pop() 刪除第一個元素
3.push() 加入一個元素
4.size() 返回優先隊列中擁有的元素的個數
5.top() 返回優先隊列中有最高優先級的元素
********************************************************/
#include <iostream> 
#include <queue> 
using namespace std; 
class T 
{ 
public: 
    char ch;
    int z; 
    T(char a, int b):ch(a), z(b){} 
}; 
bool operator < (const T &t1, const T &t2) { 
         return t2.z < t1.z; 
} 
 int main() 
 { 
    priority_queue<T, vector<T>,less<T> > q; 
    T t1('z',100);
    cout<<"最初優先隊列 size="<<q.size()<<endl;
    q.push(T('a',5)); 
    q.push(T('b',16)); 
    q.push(T('c',9)); 
    q.push(T('d',12)); 
    q.push(t1);
    cout<<"size="<<q.size()<<endl;
    while (!q.empty()) { 
        T t = q.top(); 
        q.pop(); 
        cout << t.ch << " "" " << t.z <<  endl; 
    } 
    return 1; 
 }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章