亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

C++中STL的優(yōu)先隊列priority_queue詳解

 更新時間:2023年08月23日 10:03:14   作者:吃代碼的喵醬-i  
這篇文章主要介紹了C++中STL的優(yōu)先隊列priority_queue詳解,今天講一講優(yōu)先隊列(priority_queue),實際上,它的本質(zhì)就是一個heap,我從STL中扒出了它的實現(xiàn)代碼,需要的朋友可以參考下

淺談C++ STL中的優(yōu)先隊列(priority_queue) 

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

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

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

第一種實現(xiàn)方式較為常用,接下來我給出STL中的對應(yīng)聲明,再加以解釋。

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

大家可以看到,默認(rèn)模板有三個參數(shù),第一個是優(yōu)先隊列處理的類,第二個參數(shù)比較有特點,是容納優(yōu)先隊列的容器。

實際上,優(yōu)先隊列是由這個容器+C語言中關(guān)于heap的相關(guān)操作實現(xiàn)的。

這個容器默認(rèn)是vector,也可以是dequeue,因為后者功能更強(qiáng)大,而性能相對于vector較差,考慮到包裝在優(yōu)先隊列后,后者功能并不能很好發(fā)揮,所以一般選擇vector來做這個容器。

第三個參數(shù)比較重要,支持一個比較結(jié)構(gòu),默認(rèn)是less,默認(rèn)情況下,會選擇第一個參數(shù)決定的類的<運(yùn)算符來做這個比較函數(shù)。

接下來開始坑爹了,雖然用的是less結(jié)構(gòu),然而,隊列的出隊順序卻是greater的先出!

就是說,這里這個參數(shù)其實很傲嬌,表示的意思是如果!cmp,則先出列,不管這樣實現(xiàn)的目的是啥,大家只能接受這個實現(xiàn)。

實際上,這里的第三個參數(shù)可以更換成greater,像下面這樣:

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

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

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

class Student
{
    int id;
    char name[20];
    bool gender;
    bool operator < (Student &a) const
    {
        return id > a.id;
    }
};

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

如果我們不使用自定義類,又要用非默認(rèn)方法去排序怎么辦?

就比如說在Dijkstra中,我們當(dāng)然不會用點的序號去排列,無論是正序還是反序,我們想用點到起點的距離這個值來進(jìn)行排序,我們怎樣做呢?

優(yōu)先隊列默認(rèn)使用的是小于結(jié)構(gòu),而上文的做法是為我們的自定義類去定義新的小于結(jié)構(gòu)來符合優(yōu)先隊列,我們當(dāng)然也可以自定義比較結(jié)構(gòu)。

自定義方法以及使用如下,我直接用Dijkstra代碼來說明:

int cost[MAX_V][MAX_V];
int d[MAX_V], V, s;
//自定義優(yōu)先隊列l(wèi)ess比較函數(shù)
struct cmp
{
    bool operator()(int &a, int &b) const
    {
        //因為優(yōu)先出列判定為!cmp,所以反向定義實現(xiàn)最小值優(yōu)先
        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);
            }
        }
    }
}

優(yōu)先隊列的日常使用,了解上面那些就已經(jīng)足夠。下面給出優(yōu)先隊列的所有成員函數(shù)的STL實現(xiàn)方法,希望你看完沒有一臉臥槽的感覺。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();
        }

到此這篇關(guān)于C++中STL的優(yōu)先隊列priority_queue詳解的文章就介紹到這了,更多相關(guān)STL的優(yōu)先隊列內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C++設(shè)置超時時間的簡單實現(xiàn)方法

    C++設(shè)置超時時間的簡單實現(xiàn)方法

    這篇文章主要介紹了C++設(shè)置超時時間的簡單實現(xiàn)方法,涉及系統(tǒng)函數(shù)setsockopt對套接口的操作,具有一定的實用價值,需要的朋友可以參考下
    2014-10-10
  • C語言中數(shù)組作為函數(shù)的參數(shù)以及返回值的使用簡單入門

    C語言中數(shù)組作為函數(shù)的參數(shù)以及返回值的使用簡單入門

    這篇文章主要介紹了C語言中數(shù)組作為函數(shù)的參數(shù)以及返回值的使用簡單入門,這里以一維數(shù)組作為基本條件進(jìn)行例子講解,需要的朋友可以參考下
    2015-12-12
  • C語言冷門知識之你可能沒聽過的柔性數(shù)組

    C語言冷門知識之你可能沒聽過的柔性數(shù)組

    柔性數(shù)組(Flexible Array)是引入的一個新特性,它允許你在定義結(jié)構(gòu)體時創(chuàng)建一個空數(shù)組,而這個數(shù)組的大小可以在程序運(yùn)行的過程中根據(jù)你的需求進(jìn)行更改特別注意的一點是:這個空數(shù)組必須聲明為結(jié)構(gòu)體的最后一個成員,并且還要求這樣的結(jié)構(gòu)體至少包含一個其他類型的成員
    2021-10-10
  • C++中atof?函數(shù)的介紹

    C++中atof?函數(shù)的介紹

    這篇文章主要給大家分享的是C++中atof?函數(shù)的介紹,在?stdlib.h?中?atof?函數(shù),可用于將?char?字符串轉(zhuǎn)為?float?/?double?浮點數(shù)類型,想具體了解語法的小伙伴可以參考下面文章的內(nèi)容,希望對大家有所幫助
    2021-11-11
  • Cocos2d-x觸摸事件實例

    Cocos2d-x觸摸事件實例

    這篇文章主要介紹了Cocos2d-x觸摸事件實例,本文代碼中包含大量注釋來說明Cocos2d-x中的觸摸事件使用示例,需要的朋友可以參考下
    2014-09-09
  • C++開發(fā):為什么多線程讀寫shared_ptr要加鎖的詳細(xì)介紹

    C++開發(fā):為什么多線程讀寫shared_ptr要加鎖的詳細(xì)介紹

    本篇文章介紹了,在C++中為什么多線程讀寫shared_ptr要加鎖的詳細(xì)說明。需要的朋友參考下
    2013-04-04
  • C++中的STL中map用法詳解(零基礎(chǔ)入門)

    C++中的STL中map用法詳解(零基礎(chǔ)入門)

    map在編程中是經(jīng)常使用的一個容器,本文來講解一下STL中的map,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-08-08
  • c++先序二叉樹的構(gòu)建詳解

    c++先序二叉樹的構(gòu)建詳解

    在本篇文章里小編給大家分享了關(guān)于c++先序二叉樹的構(gòu)建的相關(guān)知識點,需要的朋友們跟著學(xué)習(xí)下。
    2019-04-04
  • Qt?QString的使用實現(xiàn)

    Qt?QString的使用實現(xiàn)

    本文主要介紹了Qt?QString的使用實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-05-05
  • 一文帶你快速了解C/C++標(biāo)準(zhǔn)庫中的ptrdiff_t

    一文帶你快速了解C/C++標(biāo)準(zhǔn)庫中的ptrdiff_t

    ptrdiff_t是C/C++標(biāo)準(zhǔn)庫中定義的一個與機(jī)器相關(guān)的數(shù)據(jù)類型,ptrdiff_t類型變量通常用來保存兩個指針減法操作的結(jié)果,下面這篇文章主要給大家介紹了關(guān)于C/C++標(biāo)準(zhǔn)庫中ptrdiff_t的相關(guān)資料,需要的朋友可以參考下
    2022-11-11

最新評論