優先隊列是個很方便的東西,然而很多時候本人自己一直搞不清他是大頂堆還是小頂堆,后來在學習中終於明白了;
優先隊列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 };
3.我們可以自己定義比較器,這個比較神奇,我只知道大概寫法,比較器是個類;重載的是”()“,在優先隊列中默認為"<",
1 class mycmp{ 2 public : 3 bool operator() (比較的元素類型 a1,比較的元素類型 a2) 4 { 5 return 比較的方法; 6 } 7 };
這里注意重載的是(),就是小於號,得到的重載完后,que.top()是隊尾的元素;