优先队列(priority_queue)--自定义排序

A: 默认排序

1,priority_queue< int > a;     // 基础类型, 默认是大顶堆,自动排

2,priority_queue<int, vector< int >, greater< int > > c;     //基础类型,变小根堆

#include<bits/stdc++.h>
#define ll long long
#define PP pair<int,int>
using namespace std;

int main()
{
    priority_queue< int,vector<int>,greater<int> > q;
    q.push(1);
    q.push(5);
    q.push(3);

    while(!q.empty())
    {
        printf("%d\n",q.top());
        q.pop();
    }

    return 0;
}

B: 自定义排序

       方法一: 运算符重载

结构体内 重载运算符<

#include<bits/stdc++.h>
#define ll long long
using namespace std;

#define PP pair<int,int>

struct Node{

    int x,y,z;
    Node(int a,int b,int c)
    {
        x=a,y=b,z=c;
    }
    bool operator<(const Node &a) const   //*****  运算符重载 < ,内置
    {
        return a.z>z;  //按z值降序
    }
};

int main()
{
    priority_queue<Node> q;
    q.push(Node(1,2,3));
    q.push(Node(3,9,1));
    q.push(Node(2,3,4));
    while(!q.empty())
    {
        printf("%d %d %d\n",q.top().x,q.top().y,q.top().z);
        q.pop();
    }

    return 0;
}

       方法二: 重写仿函数

priority_queue< 类型,vector< 类型 >,cmp> q;

#include<bits/stdc++.h>
#define ll long long
using namespace std;

#define PP pair<int,int>

struct cmp{    
            //重写仿函数
   bool operator()(PP a,PP b)
   {
       return a.first>b.first;
   }

};

int main()
{
     priority_queue<PP,vector<PP>,cmp> q;

     q.push(make_pair(4,6));
     q.push(make_pair(9,4));
     q.push(make_pair(6,1));
     while(!q.empty())
     {
         printf("%d %d\n",q.top().first,q.top().second);
         q.pop();
     }

    return 0;
}

  • 23
    点赞
  • 64
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
优先队列是一种数据结构,可以根据元素的优先级来进行插入和删除操作。在C++中,可以使用自定义排序和lambda表达式来实现对优先队列排序。 下面是一个示例代码,演示了如何使用lambda表达式自定义排序规则来创建一个具有自定义排序功能的优先队列: ```cpp #include <iostream> #include <queue> using namespace std; struct Person { string name; int age; // 自定义排序规则 bool operator<(const Person& other) const { // 根据年龄进行降序排序 return age < other.age; } }; int main() { // 创建一个优先队列,使用lambda表达式作为自定义排序规则 priority_queue<Person, vector<Person>, function<bool(const Person&, const Person&)>> pq([](const Person& p1, const Person& p2) { // 根据姓名长度进行升序排序 return p1.name.length() > p2.name.length(); }); // 添加元素到优先队列 pq.push({"Alice", 25}); pq.push({"Bob", 30}); pq.push({"Charlie", 20}); // 输出排序后的结果 while (!pq.empty()) { Person p = pq.top(); pq.pop(); cout << "Name: " << p.name << ", Age: " << p.age << endl; } return 0; } ``` 在这个示例中,我们定义了一个名为Person的结构体,其中包含了姓名和年龄两个成员变量。我们通过在结构体中重载小于运算符来定义排序规则,即根据年龄进行降序排序。 在主函数中,我们创建了一个优先队列priority_queue)对象pq,并使用lambda表达式作为自定义排序规则。lambda表达式接受两个Person对象作为参数,并返回一个bool值,表示它们的相对顺序。 然后,我们向优先队列中添加了几个Person对象,并通过循环不断从队列中取出元素,直到队列为空。输出结果按照我们定义的排序规则进行了排序。 希望这个示例对你有帮助!如果你还有其他问题,请随时提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值