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)的行爲特徵。
首先函數在頭文件
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;
}