1. 程式人生 > 其它 >C++ queue 用法簡述

C++ queue 用法簡述

以下將結合例項簡單介紹(STL queue)(priority_queue)的使用:

佇列是一種特殊的線性表,特殊之處在於它只允許在表的前端(front)進行刪除操作,而在表的後端(rear)進行插入操作。——百度百科

C++提供了符合這一性質的容器,可供直接定義使用。但使用之前,需包含#include<queue>標頭檔案,為了防止疏漏,不妨直接放上下面那段程式碼():

#include<cstdio>
#include<iostream>
#include<queue>
#include<vector>
#include<algorithm>
#include<map>
#include<cmath>
#include<cstring>
#include<cstdlib>
#include<set>
#include<utility>
#include<stack>
#include<deque>
using namespace std;

佇列的定義方式:

queue<string> queue_1; //直接構造
queue<string> queue_2 {queue_1}; //使用拷貝構造

具體使用(採用一個例項來說明):

#include<cstdio>
#include<iostream>
#include<queue>
#include<vector>
#include<algorithm>
#include<map>
#include<cmath>
#include<cstring>
#include<cstdlib>
#include<set>
#include<utility>
#include<stack>
#include<deque>
using namespace std;

int main()
{
    queue<int> queue_1;
    for(int i=0; i<=9; i++)
    queue_1.push(i); //在尾部新增元素

    cout<< "first_item="<< queue_1.front() <<endl; //首位元素
    cout<< "last_item="<< queue_1.back() <<endl; //末位元素
    cout<< "max_size="<< queue_1.size() <<endl; //佇列長度
    

    queue_1.pop(); //從隊首彈出一個元素
    queue_1.emplace(10,2); //在尾部生成物件,這裡指插入2個10
    queue<int> queue_2 {queue_1}; //拷貝定義

    queue<int> queue_3;
    queue_1.swap(queue_3); //交換兩個佇列的內容,型別必須相同,大小可以不同

    //最後我們輸出看看現在佇列內的元素情況
    cout<<"queue_2:"<<endl;
    while(!queue_2.empty()) //當不為空,返回true
    {
        cout<<queue_2.front()<<" ";
        queue_2.pop();
    }
    cout<<"queue_3:"<<endl;
    while(!queue_3.empty()) //當不為空,返回true
    {
        cout<<queue_3.front()<<" ";
        queue_3.pop();
    }

    return 0;
}

我們得到的輸出為(理論上):

first_item=0
last_item=9
max_size=10
queue_2:
1 2 3 4 5 6 7 8 9 10 10 
queue_3:
1 2 3 4 5 6 7 8 9 10 10 

為什麼會得到這樣的輸出?

首先,使用push函式向佇列queue_1中新增元素0-9,之後,使用pop函式彈出隊首元素0,又使用emplace函式新增2個10進入佇列,此時佇列中元素依次為[1,2,3,4,5,6,7,8,9,10,10]。由於queue_2採用拷貝定義,故其內元素與queue_1相同;使用swap函式實現佇列的交換,使得queue_3內元素與之前 queue_1相同,queue_1變為空佇列。

注意

emplace函式、swap函式與拷貝定義對編譯器的要求較高,可以儘量避免使用這些函式。


接下來簡要介紹優先佇列priority_queue的用法:

其本質是一個堆,同樣需包含標頭檔案#include <queue>。定義時,預設為大頂堆,小頂堆需要單獨說明:

//各部分含義:priority_queue<Type, Container, Functional>
priority_queue <int,vector<int>,greater<int> > q; //小頂堆
priority_queue <int,vector<int>,less<int> >q; //大頂堆
//大頂堆也可直接這樣定義:
priority_queue<int> q;

若其內元素為pair<int, int>型別,則先比較第一個元素,後比較第二個元素

其使用方法與上述佇列基本操作相同,在此不贅述。

參考網址:

http://c.biancheng.net/view/479.html

<c++優先佇列(priority_queue)用法詳解_呂白_的部落格-CSDN部落格_c++優先佇列>