优先队列小结

#include<bits/stdc++.h>
#define FAST ios_base::sync_with_stdio(false), cin.tie(0), cout.tie(0);
#define ms(a,b) memset(a,b,sizeof(a))
#define rush() int T;cin>>T;while(T--)
#define ll long long

using namespace std;
const int N = 10e5;


/*
-----------------------------priority_queue优先队列--------------------------------
包含在头文件 #include<queue>中 
它能够使插入(Insert)和删除最小(DeleteMin)这两种操作的最坏时间复杂度为O(N)
而插入的平均时间复杂度为常数时间,即O(1)。同时不需要引入指针。


常用操作: 
top 访问队头元素  O(lgn)
empty 队列是否为空
size 返回队列内元素个数
push 插入元素到队尾 (并排序)
emplace 原地构造一个元素并插入队列
pop 删除队头元素  O(lgn)
swap 交换内容
----------------------------------------------------------------------------------- 
*/

/*
----------------------------make_pair知识点----------------------------------------
	std::pair主要的作用是将两个数据组合成一个数据,两个数据可以是同一类型或者不同类型。
例如std::pair<int,float> 或者 std::pair<double,double>等。

pair实质上是一个结构体,其主要的两个成员变量是first和second,这两个变量可以直接使用。
初始化一个pair可以使用构造函数,也可以使用std::make_pair函数,make_pair函数的定义如下:
template pair make_pair(T1 a, T2 b) { return pair(a, b); }

    一般make_pair都使用在需要pair做参数的位置,可以直接调用make_pair生成pair对象。 
另一个使用的方面就是pair可以接受隐式的类型转换,这样可以获得更高的灵活度。但是这样会出现如下问题:
	例如有如下两个定义:
	
		std::pair<int, float>(1, 1.1);
		std::make_pair(1, 1.1);
		
其中第一个的second变量是float类型,而make_pair函数会将second变量都转换成double类型。
这个问题在编程是需要引起注意。

pair优先队列使用示例: 

	priority_queue<pair<int, int> >pair_one;//pair优先队列先比较first大小,之后是second 
    pair<int, int> b(1, 2);
    pair<int, int> c(1, 3);
    pair<int, int> d(2, 5);
    pair_one.push(d);
    pair_one.push(c);
    pair_one.push(b);
    while (!pair_one.empty()) 
    {
        cout << pair_one.top().first << ' ' << pair_one.top().second << '\n';
        pair_one.pop();
    }
------------------------------------------------------------------------------------
*/


int main(){
	int term;
	/*类型 1*/priority_queue<int>ans;//对于基础类型 默认是大顶堆  元素从大到小排列 
	//等同于 priority_queue<int, vector<int>,less<int> >ans;这里一定要有空格,不然成了右移运算符
	
	/*类型 2*/priority_queue<int, vector<int>, greater<int> >queue_one;  //这样就是小顶堆 元素从小到大排列
	//小顶堆需要有头文件#include<functional> 
	
	/*类型 3*/priority_queue<int, vector<int>, cmp1 > q;//传入比较结构体,自定义优先级 
	
			struct cmp1{
    			bool operator ()(int a,int b){    //通过传入不同类型来定义不同类型优先级
        			return a>b;    //最小值优先
    			}
			};
			struct cmp2{
    			bool operator ()(int a,int b){
        			return a<b;    //最大值优先
    			}
			};
			

	/*类型 4*/priority_queue<node> q;//自定义数据结构,自定义优先级。
	//注意 在该类型中 需要重载 < 操作符 
	
      		struct node {
    			int priority;
    			int value;
    			friend bool operator < (const node &a, const node &b) {  
        			return a.priority < b.priority;
    			}
    		/* 这样写也可以
    		bool operator < (const node &a) const {
        		return priority < a.priority;
    		}
    		*/
			};
	return 0; 
} 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值