priority_queue

本文深入讲解了C++ STL中的优先队列(priority_queue),包括其基本用法、构造方式、自定义优先级等高级功能。通过具体示例展示了如何定义比较器以实现不同优先级策略,适合初学者和进阶读者。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

priority_queue函数原型及改造

struct cmp1  
{    
    bool operator ()(int &a,int &b)  
    {    
        return a>b;//最小值优先     
    }    
};    
struct cmp2  
{    
    bool operator ()(int &a,int &b)  
    {    
        return a<b;//最大值优先     
    }    
};    
struct node1  
{    
    int u;    
    bool operator < (const node1 &a) const   
    {    
       return u>a.u;//最小值优先     
    }    
};    
struct node2  
{    
    int u;    
    bool operator < (const node2 &a) const   
    {    
        return u<a.u;//最大值优先     
    }    
};   

priority_queue<int>q1;//采用默认优先级构造队列       
priority_queue<int,vector<int>,cmp1>q2;//最小值优先     
priority_queue<int,vector<int>,cmp2>q3;//最大值优先     
priority_queue<int,vector<int>,greater<int> >q4;//注意“>>”会被认为错误,     
                                                //这是右移运算符,所以这里用空格号隔开,最小值优先   
priority_queue<int,vector<int>,less<int> >q5;//最大值优先      
priority_queue<node1>q6;  //自定义优先级  
priority_queue<node2>q7;  

priority_queue函数定义及功能

STL之优先队列
原本以为priority_queue很简单,才知道原来懂的只是最简单的形式。
头文件:#include
优先队列,也就是原来我们学过的堆,按照自己定义的优先级出队时。默认情况下底层是以Vector实现的heap。
既然是队列,也就只有入队、出队、判空、大小的操作,并不具备查找功能。
函数列表:
empty() 如果优先队列为空,则返回真
pop() 删除第一个元素
push() 加入一个元素
size() 返回优先队列中拥有的元素的个数
top() 返回优先队列中有最高优先级的元素
用途就不用多说了吧,例如Huffman编码、分支限界、A*启发式都需要用到优先队列存放信息。
来看最常用的几个功能,了解一下其中的知识点:

一:最基本的功能
#include<iostream>
#include<queue>
using namespace std;
int main()
{
    priority_queue<int> Q;
    Q.push(2);
    Q.push(5);
    Q.push(3);
    while(!Q.empty())
    {
           cout<<Q.top()<<endl;
           Q.pop();
    }  
    system("pause");
    return 0;
}

优先队列最基本的功能就是出队时不是按照先进先出的规则,而是按照队列中优先级顺序出队。
知识点:1、一般存放实型类型,可比较大小
2、默认情况下底层以Vector实现
3、默认情况下是大顶堆,也就是大者优先级高,后面可以自定义优先级比较规则
二:次基本的功能
#include<iostream>
#include<queue>
using namespace std;
int main()
{
    int a[5]={3,4,5,2,1};
    priority_queue<int> Q(a,a+5);
    while(!Q.empty())
    {
           cout<<Q.top()<<endl;
           Q.pop();
    }  
    system("pause");
    return 0;
}

可以将一个存放实型类型的数据结构转化为优先队列,这里跟优先队列的构造函数相关。
上面那个默认构造一个空的优先队列,什么都使用默认的。
而这里使用的是
Priority_queue(InputIterator first,InputIterator last)
我理解的就是给出了一个容器的开口和结尾,然后把这个容器内容拷贝到底层实现(默认vector)中去构造出优先队列。这里也使用了一个默认的比较函数,也是默认大顶堆。

三: 应该掌握的功能:
#include<iostream>
#include<queue>
using namespace std;

typedef pair<long,int> Node;

priority_queue< Node,vector< Node >,greater< Node > > Q;

这个里面定义了一个制定存放元素(Node),底层实现以vector实现(第二个参数),优先级为小顶堆(第三个参数)。
前两个参数没什么说的,很好理解,其中第三个参数,默认有三写法:
小顶堆:greater
大顶堆:less
如果想自定义优先级而TYPE不是基本类型,而是复杂类型,例如结构体、类对象,则必须重载其中的operator(),见下面的例子。

例子:

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

//模拟存放节点信息
typedef struct
{
int a;
int b;      
}Node;
//自定义优先级类型
struct cmp
{
       bool operator()(const Node &t1,const Node &t2)
       {
            return t1.b<t2.b;//相当于less,大顶堆    
       }
};
int main()
{
    //初始化
   int n;
   cin>>n;
   Node *arr=new Node[n];
   for(int i=0;i<n;i++)
   {
          cin>>arr[i].a>>arr[i].b;       
   }
   //定义优先队列 ,自定义优先级,跟Qsort里面自定义相似
   priority_queue<Node,vector<Node>,cmp> Q(arr,arr+n);
   while(!Q.empty())
   {
         Node n=Q.top();
         cout<<n.a<<" "<<n.b<<endl;
         Q.pop();             
   }
    system("pause");
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值