1. 程式人生 > >C++的STL容器之容器介面卡:stack、queue、priority_queue

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