priority_queue又稱為優(yōu)先隊(duì)列,其底層是用堆來進(jìn)行實(shí)現(xiàn)的。在優(yōu)先隊(duì)列中,隊(duì)首元素一定是當(dāng)前隊(duì)列中優(yōu)先級最高的那一個。
當(dāng)然,可以在任何時候往優(yōu)先隊(duì)列里面加入(push)元素,而優(yōu)先隊(duì)列底層的數(shù)據(jù)結(jié)構(gòu)堆(heap)會隨時調(diào)整結(jié)構(gòu),使得每次的隊(duì)首元素都是優(yōu)先級最大的。
定義:priority_queue<typename> name;
和隊(duì)列不一樣的是,優(yōu)先隊(duì)列沒有front()和back()函數(shù),而只能通過top()函數(shù)來訪問隊(duì)首元素。
(1)push()
(2)top():可以獲得隊(duì)首元素(即堆頂元素)
(3)pop():隊(duì)首元素(即堆頂元素)出隊(duì)

(4)empty():和queue一樣
(5)size():
priority_queue優(yōu)先級的設(shè)置:
下面介紹基本數(shù)據(jù)類型和結(jié)構(gòu)體類型的優(yōu)先級設(shè)置方法
①基本數(shù)據(jù)類型的優(yōu)先級設(shè)置
priority_queue<int, vector<int>, less<int> > q; ? ? ? ? //less<int>表示數(shù)字大的優(yōu)先級越大,而greater<int>表示數(shù)字小的優(yōu)先級越大
priority_queue<int, vector<int>, greater<int> > q; ? ?//vector<int>是用來承載底層數(shù)據(jù)結(jié)構(gòu)堆(heap)的容器

②結(jié)構(gòu)體的優(yōu)先級設(shè)置

完整示例:

此處小于號的重載于排序函數(shù)sort中的cmp函數(shù)有些類似。事實(shí)上,兩者的作用確實(shí)是類似的,只不過效果看上去似乎是“相反”的。在排序中,如果是“return f1.price > f2.price”,那么則是按價格從高到低排序,但是在優(yōu)先隊(duì)列中卻是把價格低的放到隊(duì)首。原因在于,優(yōu)先隊(duì)列本身默認(rèn)的規(guī)則就是優(yōu)先級高的放在隊(duì)首,因此把小于號重載為大于號的功能時只是把這個規(guī)則反向了一下。如果讀者無法理解,那么不妨記住,優(yōu)先隊(duì)列的這個函數(shù)與sort中的cmp函數(shù)的效果是相反的。
有沒有辦法跟sort中的cmp函數(shù)那樣寫在結(jié)構(gòu)體外面呢?
自然是有辦法的,只需把friend去掉,把小于號改成一對小括號,再把重載的函數(shù)寫在結(jié)構(gòu)體外面,同時將其用struct包裝起來。
