IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> priority_queue的一般用法 -> 正文阅读

[C++知识库]priority_queue的一般用法

什么是优先队列

priority_queue本质是一个堆。

特点

priority_queue模拟的是队列这种数据结构,底层用堆结构来存储数据,使用该容器存储元素和队列相似,即“只从一端进(称为队尾),只从一端出(称为队首)”。我们每次访问也只能访问到队首元素。
但是优先队列存在优先级,也就是优先级高的在队列中位置更靠近队首,而队首元素也是优先队列中优先级最高的元素。
对于优先级的评定规则,我们默认为 s t d : : l e s s < T > std::less<T> std::less<T>按元素值从大到小排序,我们也可以用 s t d : : g r e a t e r < T > std::greater<T> std::greater<T>按元素值从小到达排序。(前者队首元素值在队列中最大,后者队首元素值在队列中最小
我们也可以自定义优先级 o p e r a t o r operator operator
可以参考一下代码

priority_queue<Type> T;
/*表示一个存储元素类型为Type类型的命名为T的优先队列,其优先级默认为less*/
等同于如下定义方式
priority_queue<Type, vector<Type> ,less<Type> >T;
而如果是优先级为greater,则如下
priority_queue<Type, vettor<Type>, greater<Type> >T;
/*表示存储元素类型为Type类型的命名为T的优先队列,优先级为greater,即从小到大排血*/

所带参数

priority_queue<Type, Container, Functional>
Type表示数据类型,Container表示为保存数据的容器,Functional即为元素比较方式。
注意: C o n t a i n e r Container Container必须是用数组实现的容器,例如 v e c t o r , d e q u e vector,deque vectordeque等,但是不能用 l i s t list list。默认容器为 v e c t o r vector vector

相关操作

priority_queue<int> heap;//创建一个命名为heap的优先队列

heap.top(),heap.pop(),heap.empty() and heap.push()

heap.push(num);
//将num数据从队尾压入优先队列,同时队列会自行按照从大到小的顺序将其放在正确的位置
heap.pop();
//与队列相同,弹出队首的元素
heap.top();
//优先队列没有front,但是又top,该操作为返回队首的元素
heap.empty();
//如果该优先队列为空,那么返回true,否则返回false

我们看如下代码展示(后面的代码我们仅展示solve里面的部分

#include<iostream>
#include<algorithm>
#include<queue>
#define INF 0x7fffffff
#define ll long long
#define rei register int
using namespace std;
const int N = 1e6+5;
void solve(){
	priority_queue<int>heap;
	heap.push(1);
	heap.push(2);
	heap.push(9);
	while(!heap.empty()){
		printf("%d ",heap.top());
		heap.pop();
	}
}
int main(){
	solve();
	return 0;
}

运行结果如下
请添加图片描述
我们可以看到heap里的元素按从大到小的顺序输出,我们当然也可以从小到大得输出。
如下所示

void solve(){
	priority_queue<int, vector<int>,greater<int> >heap;
	for(int i = 10;i > 0;i--){
		heap.push(i);
	}
	while(!heap.empty()){
		printf("%d ",heap.top());
		heap.pop();
	}
}

运行结果如下:
请添加图片描述

heap.size(), heap.swap()

heap.size();//返回heap中得元素个数
heap.swap(heap1);//交换两个优先队列的所有数据

注意:数据互换的两个优先队列必须存储数据相同且底层存储的容器必须相同
举个栗子如下所示

void solve(){
	priority_queue<int >heap1;
	priority_queue<int >heap2;
	for(int i = 0;i < 10;i++)heap1.push(i);
	for(int i = 11;i < 21;i++)heap2.push(i);
	printf("heap1的元素个数%d heap2的元素个数%d\n",heap1.size(),heap2.size());
	printf("交换前\n");
	for(int i = 0;i < 10;i++)printf("%d ",heap1.top()), heap1.pop();printf("\n");
	for(int i = 0;i < 10;i++)printf("%d ",heap2.top()), heap2.pop();printf("\n");
	printf("交换后\n");
	for(int i = 0;i < 10;i++)heap1.push(i);
	for(int i = 11;i < 21;i++)heap2.push(i);
	heap1.swap(heap2);
	for(int i = 0;i < 10;i++)printf("%d ",heap1.top()), heap1.pop();printf("\n");
	for(int i = 0;i < 10;i++)printf("%d ",heap2.top()), heap2.pop();printf("\n");
}

运行结果如下:
请添加图片描述

自定义operator优先级

直接代码展示更加直观一些

struct node{
	int x, y;
	node (int a = 0, int b = 0):
		x(a),y(b){}
};
struct cmp{
	bool operator()(node a, node b){
		if(a.y==b.y)return a.x > b.x;
		return a.y < b.y;
	}
};
void solve(){
	priority_queue<node, vector<node>, cmp> heap;
	node vec;
	for(int i = 0;i < 10;i++){
		heap.push(node(rand(),rand()));
	}
	while(!heap.empty()){
		printf("%d %d\n",heap.top().x,heap.top().y);
		heap.pop();
	}
}

测试结果如下
请添加图片描述

以上就是我对优先队列的一个总结,如果有不对的地方希望大家可以指正。

下面介绍一道利用优先队列来解决的练习题——畜栏预定

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2021-11-26 08:41:11  更:2021-11-26 08:43:19 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 9:31:24-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码