日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

STL中的priority_queue(优先队列)

發布時間:2025/3/21 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 STL中的priority_queue(优先队列) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

引言

priority_queue 也是一種隊列,queue 有的性質和操作它也有(但是沒有back操作了),唯一不同就是它可以自動排序
它的本質是通過堆實現的,在堆排序中會見到它,下面說一下它的用法;

基本內容

頭文件#include<queue>
定義priority_queue<Type, Container, Functional>
Type就是該隊列的數據類型Container是保存數據的容器類型,且該容器必須由數組實現的,默認情況是vector;Functional可以簡單理解為數據的比較方法


默認情況下只需要傳入數據類型就可以,容器類型默認為 vector, 數據的比較方法默認為大頂堆(即從大到小排列)
如priority_queue<int> q1; 等價于 priority_queue<int, vector<int>, less<int>> q2;

注:這里面數據比較方法用到了仿函數less<int>,不了解仿函數的可以看看這篇文章:內建函數對象(STL)
不使用仿函數還可以自己寫比較規則,只需要重載運算符 < 就可以了(比較方式默認用operator<),這里就不提了;

大頂堆

大頂堆可以理解為優先輸出大的數據,也是priority_queue的默認情況;
這里的Functional是less<int>了;
測試代碼:

#include<iostream> #include<vector> #include<queue> using namespace std;int main() {//默認情況priority_queue<int> q1;q1.push(1);q1.push(4);q1.push(3);q1.push(5);q1.push(2);q1.push(8); while (!q1.empty()) {cout << q1.top() << " ";q1.pop();}cout << endl;//下列和默認情況等價priority_queue<int, vector<int>, less<int>> q2;q2.push(1);q2.push(4);q2.push(3);q2.push(5);q2.push(2);q2.push(8); while (!q2.empty()) {cout << q2.top() << " ";q2.pop();}cout << endl;return 0; }

壓入隊列的數為:1 4 3 5 2 8
輸出結果:

可以看出是從大到小排列的;

小頂堆

小頂堆可以理解為優先輸出小的數據
所以這里面Functional就需要用greater<int>了;
測試代碼:

#include<iostream> #include<vector> #include<queue> using namespace std;int main() {priority_queue<int, vector<int>, greater<int>> q1;q1.push(1);q1.push(4);q1.push(3);q1.push(5);q1.push(2);q1.push(8);while (!q1.empty()) {cout << q1.top() << " ";q1.pop();}cout << endl;return 0; }

壓入隊列的數為:1 4 3 5 2 8
輸出結果:

可以看出是從小到大排列的;

總結

再次聲明以下使用priority_queue的幾點:

  • priority_queue沒有back()操作
  • priority_queue參數容器類型是由數組實現的
  • 默認priority_queue是大頂堆(從大到小)
  • less是從大到小,greater是從小到大,一定不要弄混!!!!

總結

以上是生活随笔為你收集整理的STL中的priority_queue(优先队列)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。