优先队列的用法

优先队列和堆一样有两种形式:最大优先队列和最小优先队列。
1.如果直接定义一个优先队列,系统默认的为降序优先队列。
priority_queue<int > pq;
2. 可以通过系统默认的已有的结构greater<T>来定义一个升序的优先队列。与greater<T>类似的是less<T>。

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

int main()
{
    srand(time(NULL));
    priority_queue<int,vector<int>,greater<int> > pq;
    for(int i=10;i>0;i--)
    {
        pq.push(rand());
    }
    while(!pq.empty())
    {
        cout<<pq.top()<<endl;
        pq.pop();
    }
    return 0;
}
3.如果队列元素为某结构体,可以通过重载<符号来进行自定义优先级,这里必须要注意的是只能是<并且在重载函数还需要加上const!
#include <iostream>
#include<queue>
#include<ctime>
#include<cstdlib>
#include<vector>
using namespace std;

struct node
{
    int data;
    bool operator <(const node a)const  //!!!
    {
        return data>a.data;    //此时是升序,如果是<则是降序
    }
};

int main()
{
    srand(time(NULL));
    priority_queue<node > pq;
    for(int i=10;i>0;i--)
    {
        node t;
        t.data=rand();
        pq.push(t);
    }
    while(!pq.empty())
    {
        cout<<pq.top().data<<endl;
        pq.pop();
    }
    return 0;
}
4.结构体定义优先级还有种方式,可以不加const,但需要定义为友元。

struct node
{
    int data;
    friend bool operator <(const node a,const node b)  //!!!
    {
        return a.data>b.data;    //此时是升序,如果是<则是降序
    }
};
5.对于结构体的定义,当在使用优先级定义时,根据其是堆的特性,还可以有如下定义优先级的方式。
#include <iostream>
#include<queue>
#include<ctime>
#include<cstdlib>
#include<vector>
using namespace std;

struct node
{
    int data;
};
struct nodeCmp
{
    bool operator()(const node &a,const node &b)
    {
        return a.data>b.data; //此时为升序,<为降序
    }
};

int main()
{
    srand(time(NULL));
    priority_queue<node,vector<node>,nodeCmp> pq;  //此处定义与之前方式不同
    for(int i=10;i>0;i--)
    {
        node t;
        t.data=rand();
        pq.push(t);
    }
    while(!pq.empty())
    {
        cout<<pq.top().data<<endl;
        pq.pop();
    }
    return 0;
}





猜你喜欢

转载自blog.csdn.net/princejin_dybala/article/details/79181446