STL优先队列

本文深入探讨了优先队列的基本操作及其在C++中的实现方式,特别是通过自定义比较器来改变优先队列的行为,展示了如何使用结构体和重载运算符来实现更复杂的元素比较。

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

今天花了一个小时理顺了优先队列的基本操作 。

#include<bits/stdc++.h>
using namespace std;
struct fruit{
    string name;
    int price;
    friend bool operator < (const fruit &f1,const fruit &f2){
//    return f1.price < f2.price;
    return f1.price > f2.price;
    //重载<运算,使得比较f1,f2实际上比较他们的价格
};   //注意:只能重载'<' 其他比较关系都可通过它实现
     //例如:f1>f2 等价于 f2<f1 ;f1==f2 等价于 !(f1<f2)&&!(f2<f1)
     //若想改变优先关系,return f1.price > f2.price即可
     //参数表中的const和&是为了提高效率,可以去掉以方便理解
int main(){
    //优先队列的定义:
    priority_queue<int> q1;
    priority_queue<int,vector<int>,less<int> > q21;
    priority_queue<int,vector<int>,greater<int> > q22;
    //上面两种定义是等价的,第二种定义的三个参数分别为:
    //int--数据类型;若为string则比较字典序
    //vector<int>--用于承载堆的容器;
    //less<int>--表示低优先级(大顶堆),从大到小
    //把less换成greater,可把队列优先级换成从小到大
    //要注意,最后的'> >'必须要用空格隔开,否则会被当成位移运算符
    //优先队列借助堆实现,所以访问只能用q.top(),
    //其他操作队列相同,包括:pop(),push(),empty(),size()
    //自定义优先级,除了上面用到的greater代替less
    //要实现更加灵活的比较,就用到最开始定义的结构体
    //test:自己把参数名改一下运行即可,要改三个地方别漏了
//    for(int i=0;i<3;i++){
//        q1.push(i);
//    }
//    for(int i=0;i<3;i++){
//        printf("%d ",q1.top());
//        q1.pop();
//    }
    priority_queue<fruit> q3;
    priority_queue<fruit,vector<fruit>,less<fruit> > q4;
    //因为只能重构<,所以在函数里修改了return表达式,很僵硬。不需要改变less
    for(int i=0;i<3;i++){
        fruit f;
        //fruit f = new fruit();报错,求指教
        f.name = "haunghe";
        f.price = i;
        q4.push(f);
        //delete f;
    }
    for(int i=0;i<3;i++){
        printf(" %s :%d",q4.top().name.c_str(),q4.top().price);
        q4.pop();//注意printf输出string类型,需要转换
    }

}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值