优先队列(priority_queue)的原理及用法
一、優先隊列的原理及使用
std::priority_queue:在優先隊列中,優先級高的元素先出隊列,并非按照先進先出的要求,類似一個堆(heap)。其模板聲明帶有三個參數,priority_queue<Type, Container, Functional>, 其中Type為數據類型,Container為保存數據的容器,Functional為元素比較方式。Container必須是用數組實現的容器,比如 vector, deque. STL里面默認用的是vector. 比較方式默認用operator< , 所以如果把后面兩個參數缺省的話,優先隊列就是大頂堆,隊頭元素最大。
?
priority_queue(),默認按照從小到大排列。所以top()返回的是最大值而不是最小值!
使用greater<>后,數據從大到小排列,top()返回的就是最小值而不是最大值!
如果使用了第三個參數,那第二個參數不能省,用作保存數據的容器!!!!
priority_queue<int, greater<>> pq;//這是錯誤的 priority_queue<int,vector<int> , greater<>> pq;//這是對的這里再提一嘴,greater<int>與greater<int>() 的區別,這要根據函數原型要求參數是函數對象類型還是要求參數是結構類型。greater<int> 對應于結構的類型,greater< int>()對應于沒有參數且返回類型更大的函數的類型。比如multimap中使用不帶括號的,sort使用帶括號的。
二、基本操作
優先隊列在頭文件#include <queue>中;
其聲明格式為:priority_queue <int> ans;//聲明一個名為ans的整形的優先隊列
基本操作有:
empty( ) ?//判斷一個隊列是否為空
pop( ) ?//刪除隊頂元素
push( ) ?//加入一個元素
size( ) ?//返回優先隊列中擁有的元素個數
top( ) ?//返回優先隊列的隊頂元素
優先隊列的時間復雜度為O(logn),n為隊列中元素的個數,其存取都需要時間。
三、使用方法
#include <bits/stdc++.h> using namespace std;int main() {vector<int> aa = { 1,2,4,3,8,6,1,4 };priority_queue<int, greater<>> pq;//, vector<int>for (int i = 0; i < aa.size(); i++) {pq.push(aa[i]);}sort(aa.begin(), aa.end());for (int i = 0; i < aa.size(); i++)cout << aa[i] << endl;for (int i = 0; i < aa.size(); i++){cout << pq.top() << endl;pq.pop(); }//cout << pq << endl;system("pause");return 0; }?
總結
以上是生活随笔為你收集整理的优先队列(priority_queue)的原理及用法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C++ string清空并释放内存空间的
- 下一篇: visual studio2017调用S