Queue容器

一、Queue

(1)定義

queue單向隊列與棧有點相似,一個是在同一端存取數據,另外一個是在一端存入數據,另外一端取出數據。單向隊列中的數據是先進先出(First In First Out,FIFO)。ios

在STL中,單向隊列也是以別的容器做爲底部結構,再將接口改變,使之符合單向隊列的特性就能夠了。所以實現也是很是方便的。less

單向隊列一共6個經常使用函數(front()、back()、push()、pop()、empty()、size()),與棧的經常使用函數較爲類似。函數

(2)底層實現

與stack 模板類很類似,queue 模板類也須要兩個模板參數,一個是元素類型,一個容器類型,元素類型是必要的,容器類型是可選的,默認爲deque 類型spa

(3)使用

queue 模板類的定義在<queue>頭文件中 ,必須用宏語句 "#include <queue>" 包含進來,纔可對 queue隊列的程序進行編譯。
code

二、成員函數

(1)建立 stack 對象

queue<int> q1;
queue<double> q2;

(2)元素入隊

q.push(x);
//入隊,將x 接到隊列的末端

(3)元素出隊

q.pop();
//出隊,彈出隊列的第一個元素,注意,並不會返回被彈出元素的值

(4)訪問隊首元素orm

q.front();
//訪問隊首元素,即最先被壓入隊列的元素

(5)訪問隊尾元素

q.back()
//訪問隊尾元素,即最後被壓入隊列的元素

(6)判斷隊列空

q.empty()
//判斷隊列空,當隊列空時,返回true

(7)訪問隊列中的元素個數

q.size()
//訪問隊列中的元素個數

三、priority_queue

(1)定義

在<queue>頭文件中,還定義了另外一個很是有用的模板類priority_queue(優先隊列)。對象

優先隊列與隊列的差異在於優先隊列不是按照入隊的順序出隊,而是按照隊列中元素的優先權順序出隊(默認爲大者優先,也能夠經過指定算子來指定本身的優先順序)。接口

(2)模板參數

priority_queue 模板類有三個模板參數:第一個是元素類型,第二個容器類型,第三個是比較算子。隊列

其中後兩個均可以省略,默認容器爲vector,默認算子爲less,即小的往前排,大的日後排(出隊時序列尾的元素出隊)。it

定義priority_queue 對象的示例代碼以下:

priority_queue<int> q1;
priority_queue< pair<int, int> > q2; // 注意在兩個尖括號之間必定要留空格。
priority_queue<int, vector<int>, greater<int> > q3; // 定義小的先出隊

priority_queue 的基本操做與queue 相同。

初學者在使用priority_queue 時,最困難的可能就是如何定義比較算子了。

a、若是是基本數據類型,或已定義了比較運算符的類,能夠直接用STL 的less算子和greater算子—默認爲使用less 算子,即小的往前排,大的先出隊。

b、若是要定義本身的比較算子,方法有多種。這裏介紹其中的一種:重載比較運算符。

優先隊列試圖將兩個元素x 和y 代入比較運算符(對less 算子,調用x<y,對greater 算子,調用x>y),若結果爲真,則x 排在y 前面,y 將先於x 出隊,反之,則將y 排在x 前面,x 將先出隊。

(3)示例代碼

#include <iostream>
#include <queue>
using namespace std;
class T
{
public:
int x, y, z;
T(int a, int b, int c):x(a), y(b), z(c)
{
}
};
bool operator < (const T &t1, const T &t2)
{
return t1.z < t2.z; // 按照z 的順序來決定t1 和t2 的順序
}
main()
{
priority_queue<T> q;
q.push(T(4,4,3));
q.push(T(2,2,5));
q.push(T(1,5,4));
q.push(T(3,3,6));
while (!q.empty())
{
T t = q.top(); q.pop();
cout << t.x << " " << t.y << " " << t.z << endl;
}
return 1;
}
輸出結果爲(注意是按照z 的順序從大到小出隊的):
3 3 6
2 2 5
1 5 4
4 4 3
再看一個按照z 的順序從小到大出隊的例子:
#include <iostream>
#include <queue>
using namespace std;
class T
{
public:
int x, y, z;
T(int a, int b, int c):x(a), y(b), z(c)
{
}
};
bool operator > (const T &t1, const T &t2)
{
return t1.z > t2.z;
}
main()
{
priority_queue<T, vector<T>, greater<T> > q;
q.push(T(4,4,3));
q.push(T(2,2,5));
q.push(T(1,5,4));
q.push(T(3,3,6));
while (!q.empty())
{
T t = q.top(); q.pop();
cout << t.x << " " << t.y << " " << t.z << endl;
}
return 1;
}

輸出結果爲:

4 4 3

1 5 4

2 2 5

3 3 6

若是咱們把第一個例子中的比較運算符重載爲:

bool operator < (const T &t1, const T &t2)
{
return t1.z > t2.z; // 按照z 的順序來決定t1 和t2 的順序
}

則第一個例子的程序會獲得和第二個例子的程序相同的輸出結果。

相關文章
相關標籤/搜索