C++ queue 用法簡述
阿新 • • 發佈:2021-11-17
以下將結合例項簡單介紹(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>
型別,則先比較第一個元素,後比較第二個元素
其使用方法與上述佇列基本操作相同,在此不贅述。
參考網址: