C++的STL容器之容器介面卡:stack、queue、priority_queue
STL對定義的通用容器分三類:順序性容器、關聯式容器和容器介面卡。
順序性容器:vector、list、deque
關聯性容器:set、multiset、map、multimap
容器介面卡:stack、queue、priority_queue
本篇主要總結容器介面卡:
1、stack
stack 模板類的定義在<stack>標頭檔案中。
stack 模板類需要兩個模板引數,一個是元素型別,一個容器型別,但只有元素型別是必要的,在不指定容器型別時,預設的容器型別為deque。
定義stack 物件的示例程式碼如下:
stack<int> s1;
stack<string> s2;
stack 的基本操作有:
s.push(x); //入棧
s.pop(); //出棧,注意,出棧操作只是刪除棧頂元素,並不返回該元素。
s.top(); //訪問棧頂,但不刪除該元素
s.empty(); //判斷棧空,當棧空時,返回true。
s.size(); //訪問棧中的元素個數
2、queue
queue 模板類的定義在<queue>標頭檔案中。
與stack 模板類很相似,queue 模板類也需要兩個模板引數,一個是元素型別,一個容器類
型,元素型別是必要的,容器型別是可選的,預設為deque 型別。
定義queue 物件的示例程式碼如下:
queue<int> q1;
queue<double> q2;
queue 的基本操作有:
q.push(x); //入隊,將x 接到佇列的末端。
q.pop(); //出隊,彈出佇列的第一個元素,注意,並不會返回被彈出元素的值。
q.front(); //訪問隊首元素,即最早被壓入佇列的元素。
q.back(); //訪問隊尾元素,即最後被壓入佇列的元素。
q.empty(); //判斷佇列空,當佇列空時,返回true。
q.size(); //訪問佇列中的元素個數
3、priority_queue
在<queue>標頭檔案中,還定義了另一個非常有用的模板類priority_queue(優先佇列)。優先佇列與佇列的差別在於優先佇列不是按照入隊的順序出隊,而是按照佇列中元素的優先權順序出隊(預設為大者優先,也可以通過指定運算元來指定自己的優先順序)。
priority_queue 模板類有三個模板引數,第一個是元素型別,第二個容器型別,第三個是比較運算元。其中後兩個都可以省略,預設容器為vector,預設運算元為less,即小的往前排,大的往後排(出隊時序列尾的元素出隊)。
定義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 時,最困難的可能就是如何定義比較運算元了。
如果是基本資料型別,或已定義了比較運算子的類,
可以直接用STL 的less 運算元和greater運算元——預設為使用less 運算元,即小的往前排,大的先出隊。
如果要定義自己的比較運算元,方法有多種,這裡介紹其中的一種:過載比較運算子。
優先佇列試圖將兩個元素x 和y 代入比較運算子(對less 運算元,呼叫x<y,對greater 運算元,呼叫x>y),
若結果為真,則x 排在y 前面,y 將先於x 出隊,反之,則將y 排在x 前面,x 將先出隊。
下面介紹幾種過載運算子方法:
1.過載為友元函式:
struct node
{
int x;
int y;
//要求按y大的排序,y相同x小的排序
friend bool operator <(const node &a,const node &b) //對應less運算元
{
if(a.y==b.y)
return a.x>b.x; //x大的排在前,則出隊時x小的先出隊
else
return a.y<b.y; //y小的排在前,則出隊時y大的先出隊
}
friend bool operator >(const node &a,const node &b) //對應greater運算元
{
if(a.y==b.y)
return a.x>b.x;
else
return a.y<b.y;
}
}Node;
2.過載為外部函式:
struct node
{
int x;
int y;
//要求按y大的排序,y相同x小的排序
}Node;
bool operator <(const node &a,const node &b) //對應less運算元
{
if(a.y==b.y)
return a.x>b.x; //x大的排在前,則出隊時x小的先出隊
else
return a.y<b.y; //y小的排在前,則出隊時y大的先出隊
}
bool operator >(const node &a,const node &b) //對應greater運算元
{
if(a.y==b.y)
return a.x>b.x;
else
return a.y<b.y;
}
第一篇:C++的STL容器之順序性容器vector、list、deque
第二篇:C++的STL容器之關聯性容器set、multiset、map、multimap