亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C++ > 正文

C++之模板priority_queue

2019-11-06 07:47:16
字體:
來源:轉載
供稿:網友

從我以前的博文能看出來,我是一個隊列愛好者,很多并不是一定需要用隊列實現的算法我也會采用隊列實現,主要是由于隊列和人的直覺思維的一致性導致的。

今天講一講優先隊列(PRiority_queue),實際上,它的本質就是一個heap,我從STL中扒出了它的實現代碼,大家可以參考一下。

首先函數在頭文件<queue>中,歸屬于命名空間std,使用的時候需要注意。

隊列有兩種常用的聲明方式:

std::priority_queue<T> pq;std::priority_queue<T, std::vector<T>, cmp> pq;

 

第一種實現方式較為常用,接下來我給出STL中的對應聲明,再加以解釋。

template<class _Ty,    class _Container = vector<_Ty>,    class _Pr = less<typename _Container::value_type> >    class priority_queue

 

大家可以看到,默認模板有三個參數,第一個是優先隊列處理的類,第二個參數比較有特點,是容納優先隊列的容器。實際上,優先隊列是由這個容器+C語言中關于heap的相關操作實現的。這個容器默認是vector,也可以是dequeue,因為后者功能更強大,而性能相對于vector較差,考慮到包裝在優先隊列后,后者功能并不能很好發揮,所以一般選擇vector來做這個容器。第三個參數比較重要,支持一個比較結構,默認是less,默認情況下,會選擇第一個參數決定的類的<運算符來做這個比較函數。

接下來開始坑爹了,雖然用的是less結構,然而,隊列的出隊順序卻是greater的先出!就是說,這里這個參數其實很傲嬌,表示的意思是如果!cmp,則先出列,不管這樣實現的目的是啥,大家只能接受這個實現。實際上,這里的第三個參數可以更換成greater,像下面這樣:

std::priority_queue<T, std::vector<T>, greater<T>> pq;

 

一般大家如果是自定義類就干脆重載<號時注意下方向了,沒人在這里麻煩,這個選擇基本上是在使用int類還想小值先出列時。

從上面的剖析我們也就知道了,想要讓自定義類能夠使用優先隊列,我們要重載小于號。

復制代碼
class Student{    int id;    char name[20];    bool gender;    bool Operator < (Student &a) const    {        return id > a.id;    }};復制代碼

 

就拿這個例子說,我們想讓id小的先出列,怎么辦,就要很違和的給這個小于符號重載成實際上是大于的定義。

如果我們不使用自定義類,又要用非默認方法去排序怎么辦?就比如說在Dijkstra中,我們當然不會用點的序號去排列,無論是正序還是反序,我們想用點到起點的距離這個值來進行排序,我們怎樣做呢?細心的讀者在閱讀我的有關Dijkstra那篇文章時應該就發現了做法——自定義比較結構。優先隊列默認使用的是小于結構,而上文的做法是為我們的自定義類去定義新的小于結構來符合優先隊列,我們當然也可以自定義比較結構。自定義方法以及使用如下,我直接用Dijkstra那篇的代碼來說明:

復制代碼
int cost[MAX_V][MAX_V];int d[MAX_V], V, s;//自定義優先隊列less比較函數struct cmp{    bool operator()(int &a, int &b) const    {        //因為優先出列判定為!cmp,所以反向定義實現最小值優先        return d[a] > d[b];    }};void Dijkstra(){    std::priority_queue<int, std::vector<int>, cmp> pq;    pq.push(s);    d[s] = 0;    while (!pq.empty())    {        int tmp = pq.top();pq.pop();        for (int i = 0;i < V;++i)        {            if (d[i] > d[tmp] + cost[tmp][i])            {                d[i] = d[tmp] + cost[tmp][i];                pq.push(i);            }        }    }}復制代碼

 

優先隊列的日常使用,了解上面那些就已經足夠。下面給出優先隊列的所有成員函數的STL實現方法,希望你看完沒有一臉臥槽的感覺。c就是你聲明時候的那個vector或者其他容器。

復制代碼
    void push(value_type&& _Val)        {    // insert element at beginning        c.push_back(_STD move(_Val));        push_heap(c.begin(), c.end(), comp);        }    template<class... _Valty>        void emplace(_Valty&&... _Val)        {    // insert element at beginning        c.emplace_back(_STD forward<_Valty>(_Val)...);        push_heap(c.begin(), c.end(), comp);        }    bool empty() const        {    // test if queue is empty        return (c.empty());        }    size_type size() const        {    // return length of queue        return (c.size());        }    const_reference top() const        {    // return highest-priority element        return (c.front());        }    void push(const value_type& _Val)        {    // insert value in priority order        c.push_back(_Val);        push_heap(c.begin(), c.end(), comp);        }    void pop()        {    // erase highest-priority element        pop_heap(c.begin(), c.end(), comp);        c.pop_back();        } 復制代碼

 


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美大片大片在线播放| 亚洲国产精品yw在线观看| 欧美精品做受xxx性少妇| 国产大片精品免费永久看nba| 欧美日韩中文字幕综合视频| 国产成人在线一区| 国产乱人伦真实精品视频| 成人性生交大片免费看小说| 久久免费视频这里只有精品| 久久久精品美女| 久久精品小视频| 亚洲人精品午夜在线观看| 欧美激情亚洲另类| 在线观看视频亚洲| 91高潮精品免费porn| 欧美黄色三级网站| 狠狠久久亚洲欧美专区| 播播国产欧美激情| 精品一区精品二区| 久久中文精品视频| 亚洲精品国产精品国自产在线| www.亚洲一区| 热久久99这里有精品| 国产一区二区视频在线观看| 国产狼人综合免费视频| 国产91色在线| 亚洲一区二区三区四区在线播放| 日韩成人网免费视频| 欧美日韩在线观看视频| 中文字幕日韩精品有码视频| 午夜精品一区二区三区在线| 亚洲精品国产精品自产a区红杏吧| 国内外成人免费激情在线视频| 亚洲白虎美女被爆操| 亚洲精品国精品久久99热一| 成人性生交xxxxx网站| 国产成人精品视频在线观看| 久久久久久久久综合| 成人免费视频xnxx.com| 98精品在线视频| 69国产精品成人在线播放| 久久久久久久影院| 色偷偷888欧美精品久久久| 国产精品亚洲一区二区三区| 91精品国产高清久久久久久久久| 精品视频在线播放色网色视频| 亚洲成人黄色在线观看| 日韩成人激情影院| 精品国产一区二区三区在线观看| 国内精品小视频| 97超级碰碰碰久久久| 日韩在线视频国产| 自拍视频国产精品| 国产精品第10页| 日韩欧美中文字幕在线播放| 国产suv精品一区二区三区88区| 亚洲色图激情小说| 中文字幕日韩专区| 欧美国产日韩一区二区在线观看| 久热99视频在线观看| 久久成年人免费电影| 久久精品国产亚洲精品| 91精品视频在线看| 精品成人av一区| 91精品视频网站| 亚洲综合日韩中文字幕v在线| 日韩在线不卡视频| 久久精品最新地址| 亚洲综合一区二区不卡| 91免费国产视频| 亚洲缚视频在线观看| 久久精品国产久精国产一老狼| 亚洲国产成人精品一区二区| 日韩美女激情视频| 欧美日韩在线视频一区| 欧美午夜美女看片| 国产999视频| 精品国产乱码久久久久久婷婷| 亚洲欧美激情精品一区二区| 国产精品久久久久久久久久小说| 亚洲免费视频在线观看| 日韩在线视频观看| 一区二区三区动漫| 国产免费观看久久黄| 精品亚洲一区二区三区四区五区| 5566日本婷婷色中文字幕97| 久久成人亚洲精品| 深夜福利国产精品| 日韩精品免费电影| 日韩av影院在线观看| 亚洲资源在线看| 97视频在线观看免费高清完整版在线观看| 亚洲国产精品成人va在线观看| 2019国产精品自在线拍国产不卡| 久久久久国产精品一区| 在线观看欧美日韩国产| 国产精品精品久久久久久| 丝袜美腿亚洲一区二区| 午夜精品一区二区三区在线视| 福利一区福利二区微拍刺激| 国产精品久久久久久久久久久久| 亚洲天堂av在线免费| 欧美高清不卡在线| 欧美电影在线播放| 欧美激情按摩在线| 日韩美女写真福利在线观看| 欧美性极品xxxx娇小| 国产做受69高潮| 欧美人交a欧美精品| 欧美日韩激情小视频| 成人av色在线观看| 日韩av在线免费观看一区| 国产精品a久久久久久| 日韩视频―中文字幕| 亚洲激情在线观看| 久久精品中文字幕免费mv| 中文字幕日韩免费视频| 国产福利精品av综合导导航| 欧美国产日韩一区二区在线观看| 91国产高清在线| 日韩精品视频免费在线观看| 国产中文日韩欧美| 亚洲va码欧洲m码| 久久亚洲精品网站| 一道本无吗dⅴd在线播放一区| 欧美一级成年大片在线观看| 亚洲欧美一区二区三区四区| 亚洲最大的免费| 久久久人成影片一区二区三区| 大胆人体色综合| 亚洲人成在线电影| 91av中文字幕| 亚洲第一区中文99精品| 91在线视频一区| 国产精品久久久久久亚洲影视| 日韩免费av一区二区| 国产精品女主播视频| 欧美成人精品激情在线观看| 精品久久久久久国产| 国产精品成久久久久三级| 久久久免费电影| 亚洲va欧美va国产综合剧情| 日本精品一区二区三区在线| 日本精品免费一区二区三区| 中文字幕视频在线免费欧美日韩综合在线看| 日韩乱码在线视频| 国产精品福利在线观看网址| 97在线看免费观看视频在线观看| 国产精品香蕉在线观看| 国产亚洲欧美日韩精品| 亚洲理论片在线观看| 亚洲精美色品网站| 8x拔播拔播x8国产精品| 亚洲激情电影中文字幕| 国产欧美日韩综合精品| 久久亚洲春色中文字幕| 欧美在线观看日本一区| 久久精品久久精品亚洲人| 韩国精品美女www爽爽爽视频| 最近2019中文字幕第三页视频| 精品精品国产国产自在线| 国产成人在线精品| 热99久久精品| 欧美国产中文字幕|