C++——优先队列

本文介绍了C++中的优先队列,重点强调其在数组排序后进行操作的优势,常见于需要动态维护排序的场景。文章讨论了优先队列的基本结构和常用操作,并提供了相关代码示例。此外,还探讨了自定义优先级的方法,包括结构体和比较函数的使用,以实现更灵活的优先级设定。

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

半题外话:优先队列个人认为主要优点是可以在排序后进行类似于插入排序的操作,适合于需要在数组排序后再次进行操作的题目(再由此产生一堆bug

本蒟蒻是在敲贪心的题时遇见的(弱得连个贪心都不会敲了呵),就开始了学(mo)习(ca)之旅

____________________________

————————————————

优先队列的结构:

队列

1.back() 返回一个引用,指向最后一个元素
2.empty() 如果队列空则返回真
3.front() 返回第一个元素
4.pop() 删除第一个元素
5.push() 在末尾加入一个元素
6.size() 返回队列中元素的个数

优先队列:

1.empty() 如果优先队列为空,则返回真
2.pop() 删除第一个元素
3.push() 加入一个元素
4.size() 返回优先队列中拥有的元素的个数
5.top() 返回优先队列中有最高优先级的元素

关于头文件的问题:以上操作都在头文件#include<queue>中执行。

来份代码操作???

​#include<stdio.h>
#include<iostream>
#include<queue>
using namespace std;
int main()
{
    priority_queue<int > que; // 默认从大到小
    int n;scanf("%d",n);
    for(int i=0;i<n;i++){scanf("%d",a[i]);}
    for(int i = 0;i < n;i++)
    {
        que.push(x[i]);
    }
    for(int i = 0;i < n;i++)
    {
        printf("%d ",que.top());//将数组x进行从大到小的输出
        que.pop();
    }
    printf("\n");
    return 0;
}

排序方式可以有以下的不同写法:

priority_queue<int,vector<int>,greater<int> > que;// 从小到大 注意空格用于区分位运算
priority_queue<int,vector<int>,less<int> > que;// 从大到小
priority_queue<int > que; // 默认从大到小
//如果仅是队列的话只需要
queue<int>que;

如果操作后想进行把数据插入到有序数列的操作,只需加一句话:

#include<queue>
#include<cstdio>
using namespace std;
priority_queue<int>q;
int n,i,a,b,x,ans;
int main()
{
    scanf("%d",&n);
    for(i=1;i<=n;i++)scanf("%d",&x),q.push(x);//把x逐个输入
    while(q.size()>1)
    {
        a=q.top();q.pop();//拎出最前面(即最大)的两个值
        b=q.top();q.pop();
        ans+=a+b;//叠加操作
        q.push(a+b); //把二者的和再次插入队列中
    }
    return !printf("%d",ans);
}

由于pop的因素,原被操作的a,b两值不会再出现,也不会被再次操作。

以上够使用一段时间了(佛系自我安慰被拎走),以下是其他的优先序列定义方式:

(1)自定义优先级:

struct cmp

{     

  operator bool ()(int x, int y)     

  {        

     return x > y;   // x小的优先级高       //也可以写成其他方式,如: return p[x] > p[y];表示p[i]小的优先级高

  }

};

priority_queue<int, vector<int>, cmp> q;    //定义方法

//其中,第二个参数为容器类型。第三个参数为比较函数。

(2)结构体声明方式:

struct node

{     

  int x, y;     

  friend bool operator < (node a, node b)     //注意此处的重载

  {         

    return a.x > b.x;    //结构体中,x小的优先级高     

  }

};

priority_queue<node>q;   //定义方法

//在该结构中,y为值, x为优先级。

//通过自定义operator<操作符来比较元素中的优先级。

//在重载”<”时,最好不要重载”>”,可能会发生编译错误

————————————萌新一枚,有不足之处还望各位dalao指出ヾ(๑╹◡╹)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值