优先级队列

  1. 概念:“披着队列外衣的堆”,其中堆的底层一颗完全二叉树。如果树中每个节点的值不小于其左右孩子的值,称为大顶堆,反之则称为小顶堆。
  2. 定义:
    priority_queue<typename, container, functional>
  • typename是数据的类型
  • container是vector,queue等用数组实现的容器,不能是list
  • functional是比较的方式,如果是自己定义的类型,则要去额外实现比较函数,以此来表示是大顶堆 or 小顶堆
  • 默认大顶堆 && 小顶堆的定义:
    //构造一个大顶堆,堆中小于当前节点的元素需要下沉,因此使用less
    priority_queue<int, vector<int>, less<int>> maxHeap;
     
    //构造一个小顶堆,堆中大于当前节点的元素需要下沉,因此使用greater
    priority_queue<string, vector<string>, greater<string>> minHeap;
    // priority_queue.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
    //
    
    #include <iostream>
    #include <queue>
    using namespace std;
    //自定义数据类型,Data类
    class Data
    {
    public:
    	Data(int i, int d) :id(i), data(d) {}
    	~Data() {}
    	int getId()
    	{ 
    		return id;
    	}
    	int getData()
    	{ 
    		return data;
    	}
    private:
    	int id;
    	int data;
    };
    //重写仿函数,完成less的功能,也可以用class定义类,此时需要将运算符重载函数设为public
    // 仿函数是通过重载“()”运算符来模拟函数操作的类
    //结构体struct中默认是访问类型是public
    struct cmp
    {
    	bool operator() (Data& a, Data& b) {
    		return a.getData() < b.getData();
    	}
    };
    
    int main()
    {
    	priority_queue<Data, vector<Data>, cmp> maxHeap;//维护一个大顶堆,
    	for (int i = 0; i < 10; i++)
    	{
    		Data dt(i, rand()%100);
    		maxHeap.push(dt);
    	}
    	while (!maxHeap.empty())
    	{
    		Data topData = maxHeap.top();
    		cout << "id:" << topData.getId() << " " << "data:" << topData.getData() << endl;;
    		maxHeap.pop();
    	}
    	return 0;
    }
  • out:

    id:6 data:78
    id:4 data:69
    id:1 data:67
    id:9 data:64
    id:8 data:62
    id:7 data:58
    id:0 data:41
    id:2 data:34
    id:5 data:24
    id:3 data:0
    
    D:\Dev-Cpp\code\priority_queue\Debug\priority_queue.exe (进程 11464)已退出,代码为 0。
    要在调试停止时自动关闭控制台,请启用“工具”->“选项”->“调试”->“调试停止时自动关闭控制台”。
    按任意键关闭此窗口. . .
    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值