c++ 优先级队列priority_queue的使用

news2024/11/16 1:53:19

c++ priority_queue是对其他容器元素顺序的调整包装; 堆的原理

1.定义

priority_queue<Type, Container, Functional> q;

其中,Type是数据类型,Container是低层容器,如vector, stack, deque等. Functional是比较函数;默认可以使用greater(从小到大), less(从大到小)排序。例如,定义一个元素为整数的小顶堆:

priority_queue<int, vector<int>, greater<int>> q;

2.头文件
#include<queue>


3.常用接口
push  添加一个元素到队尾,并自动调整堆
pop    弹出队头元素
top   获取队头元素
empty 堆是否为空
size   堆的大小

4.基本数据类型 使用
原始数据[1,2,3,4,5,6,7,8] 
priority_queue<int> q;            //默认是大顶堆
等价于priority_queue<int,vector<int>, less<int>> q; 

堆内部的数据[8,7,6,5,4,3,2,1]

小顶堆的构造
priority_queue<int,vector<int>, greater<int>> q2;
堆内部的数据[1,2,3,4,5,6,7,8]

5.关联类型,pair
priority_queue<pair<int,int>> q3
排序规则默认先比较第一个值,后比较第二个值
pair<int,int> a(1,2)
pair<int,int> b(2,3)
pair<int,int> c(3,4)
q3.push(a);
q3.push(b);
q3.push(c);
q3.top().first, q3.top().second

6.自定义类型,需要重载<运算符
struct tmp1{
    int x;
    tmp1(int a) {x = a;}
    operator <(const tmp1 &a) const {
        return x < a.x;
    }
};

tmp1 t1(3);
tmp1 t2(4);
tmp1 t3(5);

priority_queue<tmp1> q;
//插入元素 
q.push(t1);
q.push(t2);
q.push(t3);

//访问
q.top().x 

#include<iostream> 
#include<vector>
#include<queue>
using namespace std;
typedef pair<int,int> P;

//自定义类型
struct tmp1 //运算符重载<
{
    int x;
    tmp1(int a) {x = a;}
    bool operator<(const tmp1& a) const
    {
        return x < a.x; //大顶堆
    }
};

struct tmp2 //重写仿函数,用于比较元素
{
    bool operator() (const pair<int,int> &a, const pair<int,int> &b) 
    {
   		if (a.first < b.first) {
   			return true;
		}
		return a.second < b.second;
    }
};

int main() {
	
	//1.升序队列 , 小顶堆 
	priority_queue<int,vector<int>,greater<int>> q1; 
	
	//2.降序队列, 大顶堆 
	priority_queue<int,vector<int>,less<int>> q2; 
	for (int i = 0; i < 10; i++) {
		q1.push(i);
		q2.push(i); 
	} 
	
	while (!q1.empty()) {
		cout << q1.top() << " ";
		q1.pop();
	}
	cout << endl;
	
	while (!q2.empty()) {
		cout << q2.top() << " ";
		q2.pop();
	}
	cout << endl;
	
	//3.关联容器
	priority_queue<P> q3;
	P p1(1,1);
	P p2(1,2);
	P p3(1,3);
	q3.push(p1);
	q3.push(p2);
	q3.push(p3);
	while (!q3.empty()) {
		cout << q3.top().first << " - " << q3.top().second << endl;
		q3.pop();
	}
	//3.1 等价于
	priority_queue<P,vector<P>,tmp2> q4;
	q4.push(p1);
	q4.push(p2);
	q4.push(p3);
	while (!q4.empty()) {
		cout << q4.top().first << " = " << q4.top().second << endl;
		q4.pop();
	}
	
	//4.自定义类型 
	priority_queue<tmp1> d;
	tmp1 a(3);
	tmp1 b(4);
	tmp1 c(5);
	d.push(a);
	d.push(b);
	d.push(c);
	
	while (!d.empty()) {
		cout << d.top().x << " ";
		d.pop();
	}
	cout << endl;
	return 0;
}

参考:c++优先队列(priority_queue)用法详解_吕白_的博客-CSDN博客_c++ 优先队列 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/175466.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

day25-类加载器反射

1.类加载器 1.1类加载器【理解】 作用 负责将.class文件&#xff08;存储的物理文件&#xff09;加载在到内存中 1.2类加载的过程【理解】 类加载时机 创建类的实例&#xff08;对象&#xff09;调用类的类方法访问类或者接口的类变量&#xff0c;或者为该类变量赋值使用反…

NodeJS 之 HTTP 模块(实现一个基本的 HTTP 服务器)

NodeJS 之 HTTP 模块&#xff08;实现一个基本的 HTTP 服务器&#xff09;参考描述HTTP 模块搭建 HTTP 服务器http.createServer()监听检测服务器端口是否被占用终端Error Code超时处理处理客户端的请求request 事件http.IncomingMessagehttp.ServerResponse中文乱码问题问题解…

Java EE之线程编(进阶版)

这些锁策略能适用于很多中语言&#xff0c;博主是学Java的&#xff0c;所以下面的代码会用Java去写&#xff0c;请大家见谅&#xff0c;但是处理的方法是大差不差的。 一、常见锁和锁策略&#xff1a; (一)、乐观锁和悲观锁 1、何为乐观锁和悲观锁呢&#xff1f; 答&#…

Linux服务器常见运维性能测试(3)CPU测试super_pi、sysbench

Linux服务器常见运维性能测试&#xff08;3&#xff09;CPU测试常见性能测试软件CPU测试&#xff1a;super_pi &#xff08;计算圆周率&#xff09;CPU测试&#xff1a;sysbench&#xff08;CPU功能测试部分&#xff09;下载安装sysbench综合测试功能执行CPU测试最近需要测试一…

Java面试题含答案,最新面试题(1)

Java 中 InvokeDynamic指令是干什么的&#xff1f; JVM字节码指令集一直比较稳定&#xff0c;一直到Java7中才增加了一个InvokeDynamic 指令&#xff0c;这是JAVA为了实现『动态类型语言』支持而做的一种改进&#xff1b;但是在Java7中并没有提供直接生成InvokeDynamic 指令的…

自定义类型:结构体,枚举,联合

目录一、结构体内存对齐二、位段2.1 什么是位段2.2 位段内存分配规则2.3 位段的跨平台问题三、枚举四、联合体4.1 联合类型的定义4.2联合的特点4.3 联合大小的计算4.4 练习一、结构体内存对齐 struct s {char c1;int i;char c2; }; int main() {printf("%d\n", size…

【Hadoop】HDFS体系结构分析

文章目录1. NameNode2. Secondary NameNode3. DataNodeHDFS主要包含NameNode、Secondary NameNode和DataNode三部分&#xff0c;且这三部分在分布式文件系统中分属不同的机器&#xff0c;其中Secondary NameNode不是必须的&#xff0c;在HA架构中Standby NameNode可以替代它。 …

【深度学习】详解 SimCLR

目录 摘要 一、引言 二、方法 2.1 The Contrastive Learning Framework 2.2. Training with Large Batch Size 2.3. Evaluation Protocol 三、用于对比表示学习的数据增广 3.1 Composition of data augmentation operations is crucial for learning good representa…

5-2中央处理器-指令周期的数据流

文章目录一.指令周期二.数据流向1.取指周期2.间址周期3.执行周期4.中断周期三.指令执行方案1.单指令周期2.多指令周期3.流水线方案一.指令周期 指令周期&#xff1a;CPU从主存中每取出并执行一条指令所需的全部时间。 此处&#xff1a;取指周期取指令指令译码 指令周期常用若…

SSM整合(Spring + SpringMVC + MyBatis)

SSM Spring SpringMVC MyBatis 准备数据库 SET FOREIGN_KEY_CHECKS0; DROP TABLE IF EXISTS user; CREATE TABLE user (id int(11) NOT NULL AUTO_INCREMENT,username varchar(20) NOT NULL COMMENT 用户名,password varchar(255) NOT NULL COMMENT 密码,real_name varchar(…

Linux常用命令——startx命令

在线Linux命令查询工具(http://www.lzltool.com/LinuxCommand) startx 用来启动X Window 补充说明 startx命令用来启动X Window&#xff0c;实际上启动X Window的程序为xinit。 语法 startx(参数)参数 客户端及选项&#xff1a;X客户端及选项&#xff1b;服务器及选项&a…

[LeetCode周赛复盘] 第 329 场周赛20230122

[LeetCode周赛复盘] 第 329 场周赛20230122 一、本周周赛总结二、 [Easy] 6296. 交替数字和1. 题目描述2. 思路分析3. 代码实现三、[Medium] 6297. 根据第 K 场考试的分数排序1. 题目描述2. 思路分析3. 代码实现四、[Medium] 6298. 执行逐位运算使字符串相等1. 题目描述2. 思路…

深入理解 OpenMP 线程同步机制

深入理解 OpenMP 线程同步机制 前言 在本篇文章当中主要给大家介绍 OpenMP 当中线程的同步和互斥机制&#xff0c;在 OpenMP 当中主要有三种不同的线程之间的互斥方式&#xff1a; 使用 critical 子句&#xff0c;使用这个子句主要是用于创建临界区和 OpenMP 提供的运行时库…

连续系统的数字PID控制仿真-1

被控对象为一电机模型传递函数&#xff1a;式中&#xff0c;J 0.0067;B0.10。采用M函数的形式&#xff0c;利用ODE45的方法求解连续对象方程&#xff0c;输入指令信号为yd(k)0.50sin(2*3.14*t)&#xff0c;采用PID控制方法设计控制器&#xff0c;其中kp20.0 ,kd0.50。PID正弦跟…

12个开源的后台管理系统

1. D2admin 开源地址&#xff1a;https://github.com/d2-projects/d2-admin 文档地址&#xff1a;https://d2.pub/zh/doc/d2-admin/ 效果预览&#xff1a;https://d2.pub/d2-admin/preview/#/index 开源协议&#xff1a;MIT 2. vue-element-admin 开源地址&#xff1a;htt…

Kettle(3):快速入门

1 需求 有一个txt文件&#xff0c;内容如下&#xff1a; id,name,age,gender,province,city,region,phone,birthday,hobby,register_date 392456197008193000,张三,20,0,北京市,昌平区,回龙观,18589407692,1970-8-19,美食;篮球;足球,2018-8-6 9:44 267456198006210000,李四,2…

Vue3 – Composition API

1、认识CompositionAPI 1.1、Options API的弊端 在Vue2中&#xff0c;我们编写组件的方式是Options API&#xff1a; Options API的一大特点就是在对应的属性中编写对应的功能模块&#xff1b;比如data定义数据、methods中定义方法、computed中定义计算属性、watch中监听属性…

【快速简单登录认证】SpringBoot使用Sa-Token-Quick-Login插件快速登录认证

一、解决的问题 Sa-Token-Quick-Login 可以为一个系统快速的、零代码 注入一个登录页面 试想一下&#xff0c;假如我们开发了一个非常简单的小系统&#xff0c;比如说&#xff1a;服务器性能监控页面&#xff0c; 我们将它部署在服务器上&#xff0c;通过访问这个页面&#xf…

学习字符串函数和内存函数必看

字符串函数 1.strlen函数 strlen库函数 #include<stdio.h> #include<string.h> int main() {char arr[] "abc";char arr1[] { a,b,c };int len strlen(arr);int len1 strlen(arr1);//没有\0就无法停止printf("%d\n",len);printf("%…

VUE中的provide和inject用法

一、Vue中 常见的组件通信方式可分为三类 父子通信 父向子传递数据是通过 props&#xff0c;子向父是通过 events&#xff08;$emit&#xff09;&#xff1b; 通过父链 / 子链也可以通信&#xff08;$parent / $children&#xff09;&#xff1b; ref 也可以访问组件实例&…