自定義比較器的優先隊列


優先隊列是個很方便的東西,然而很多時候本人自己一直搞不清他是大頂堆還是小頂堆,后來在學習中終於明白了;

優先隊列priority_queue<,,>,實際上有三個參數,第一個代表元素類型,第二個是優先隊列實現的容器類型,第三個是比較器,我們通常用的只需要輸入第一個參數,后面都是默認的;

實際上完整的是 priority_queue<類型,vector<類型>,less<類型> >;less是從小到大排序,然后優先隊列內部其實頭指針指在最后面,所以取出來是最大的,我們我們要寫小頂堆,那么只要從大到小排序,指針指在最后priority_queue<類型,vector<類型>,greater<類型> >;

下面是一些小技巧,

1.如果你依舊是大頂堆,卻想要每次得到最小的,我們只要把放入的元素變成變成負數就好了;

2.或者我們的類型是個結構體,我們可以根據自定義重載小於號,變成大於;

例如下面這種:

1 struct node{
2     int u;
3     long long dis;
4     bool operator < (const node &x) const{
5         return dis>x.dis;
6     }
7 }; 
View Code

3.我們可以自己定義比較器,這個比較神奇,我只知道大概寫法,比較器是個類;重載的是”()“,在優先隊列中默認為"<",

1 class mycmp{
2     public :
3         bool operator() (比較的元素類型  a1,比較的元素類型 a2)
4         {
5             return   比較的方法; 
6         }
7 };

這里注意重載的是(),就是小於號,得到的重載完后,que.top()是隊尾的元素;


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM