以下將結合實例簡單介紹(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>
類型,則先比較第一個元素,后比較第二個元素
其使用方法與上述隊列基本操作相同,在此不贅述。
參考網址: