优先队列(priority_queue)的原理及用法

本文介绍了C++标准库中的优先队列std::priority_queue,包括其工作原理、基本操作和使用方法。优先队列遵循大顶堆的规则,但可以通过定制比较函数实现小顶堆。在示例中展示了如何使用greater<>进行降序排列,并通过代码演示了如何插入元素、删除队顶元素以及获取队顶元素。
摘要由CSDN通过智能技术生成

一、优先队列的原理及使用

std::priority_queue:在优先队列中,优先级高的元素先出队列,并非按照先进先出的要求,类似一个堆(heap)。其模板声明带有三个参数,priority_queue<Type, Container, Functional>, 其中Type为数据类型,Container为保存数据的容器,Functional为元素比较方式。Container必须是用数组实现的容器,比如 vector, deque. STL里面默认用的是vector. 比较方式默认用operator< , 所以如果把后面两个参数缺省的话,优先队列就是大顶堆,队头元素最大。

 

priority_queue(),默认按照从小到大排列。所以top()返回的是最大值而不是最小值!

使用greater<>后,数据从大到小排列,top()返回的就是最小值而不是最大值!

如果使用了第三个参数,那第二个参数不能省,用作保存数据的容器!!!!

priority_queue<int, greater<>> pq;//这是错误的
priority_queue<int,vector<int> , greater<>> pq;//这是对的

这里再提一嘴,greater<int>与greater<int>() 的区别,这要根据函数原型要求参数是函数对象类型还是要求参数是结构类型。greater<int> 对应于结构的类型,greater< int>()对应于没有参数且返回类型更大的函数的类型。比如multimap中使用不带括号的,sort使用带括号的。

二、基本操作

优先队列在头文件#include <queue>中;

其声明格式为:priority_queue <int> ans;//声明一个名为ans的整形的优先队列

基本操作有:

empty( )  //判断一个队列是否为空

pop( )  //删除队顶元素

push( )  //加入一个元素

size( )  //返回优先队列中拥有的元素个数

top( )  //返回优先队列的队顶元素

优先队列的时间复杂度为O(logn),n为队列中元素的个数,其存取都需要时间。

三、使用方法

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

int main()
{
	vector<int> aa = { 1,2,4,3,8,6,1,4 };
	priority_queue<int, greater<>> pq;//, vector<int>
	for (int i = 0; i < aa.size(); i++) {
		pq.push(aa[i]);
	}
	sort(aa.begin(), aa.end());
	for (int i = 0; i < aa.size(); i++)
		cout << aa[i] << endl;
	for (int i = 0; i < aa.size(); i++){
		cout << pq.top() << endl;
	pq.pop();
}
	//cout << pq << endl;
	system("pause");
	return 0;
}

 

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

子木呀

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值