前言:

     priority_queue优先队列容器与队列一样,这能从队尾插入元素,从对手删除元素。但是它有一个特性,就是队列中最大的元素总是位于队首,所以出队时,并非按照先进先出的原则进行,而是将当前队列中最大的元素出队。这点类似与给队列里的元素进行了由大到小的顺序排序。元素的比较规则默认为按照元素的值由大到小排序;当然,可以重载“<”操作符来重新定义比较规则。

    使用priority_queue需要声明头文件包含语句:“#include<queue>”。它与queue共用一个头文件。

优先队列的使用方法

    优先队列包含入队push()(插入元素)出队pop()(删除元素)读取队首元素top()判断队列是否为空empty()读取队列元素数量size()等方法。

    下面这个程序详细说明了优先队列的使用方法:

#include<queue>
#include<iostream>
using namespace std;

int main()
{
    priority_queue<int>pq;
    pq.push(1);
    pq.push(2);
    pq.push(3);
    pq.push(9);
    cout<<pq.size()<<endl;
    while(!pq.empty())
    {
        cout<<pq.top()<<" ";
        pq.pop();
    }
    cout<<endl;
    return 0;
}

输出:

priority_queue优先队列容器

重载“<"操作符来定义优先级

    如果优先队列的元素类型是结构体,可以通过在结构体中重载"<"操作符的方法来修改优先队列的优先性。

#include<queue>
#include<iostream>
using namespace std;

struct Info
{
    string name;
    float score;
    bool operator < (const Info &a)const
    {
        return a.score<score;
    }
};

int main()
{
    priority_queue<Info>pq;
    Info info;
    info.name="Jack";
    info.score=68.5;
    pq.push(info);
    info.name="Bomi";
    info.score=18.5;
    pq.push(info);
    info.name="Peti";
    info.score=90;
    pq.push(info);
    cout<<pq.size()<<endl;
    while(!pq.empty())
    {
        cout<<pq.top().name<<" "<<pq.top().score<<endl;
        pq.pop();
    }
    return 0;
}

输出:

priority_queue优先队列容器

重载“()”操作符来定义优先级

如果优先队列的元素不是结构体类型,则可以通过重载“()”,操作符的方式来定义优先级。当然,元素是结构体类型,也可以通过重载“()“操作符的方式来定义优先级,而不是要在结构体内重载”<"操作符才行。

#include<queue>
#include<vector>
#include<iostream>
using namespace std;

struct myComp
{
    bool operator()(const int &a,const int &b)
    {
        return a>b;
    }
};

int main()
{
    priority_queue<int,vector<int>,myComp>pq;
    pq.push(1);
    pq.push(9);
    pq.push(2);
    pq.push(30);
    cout<<pq.size()<<endl;
    while(!pq.empty())
    {
        cout<<pq.top()<<" ";
        pq.pop();
    }
    cout<<endl;
    return 0;
}

输出:

priority_queue优先队列容器

相关文章: