当前位置: 首页 > news >正文

STL库--priority_queue

目录

priority_queue定义

prority_queue容器内元素的访问

priority_queue()常用函数实例解析

priority_queue内元素优先级的设置

priority_queue的常见用途

priority_queue又称为优先队列,其底层是用堆来进行实现的。在优先队列中,队首元素一定是当前队列中优先级最高的那一个。例如在队列有如下元素,且定义好了优先级:

桃子(优先级3)
梨子(优先级4)
苹果(优先级1)

那么出队的顺序为梨子(4)、桃子(3)、苹果(1)

当然,可以在任何时候往优先队列里面加入元素,而优先队列底层的数据结构堆会随时调整结构,使得每次的队首元素都是优先级最大的。关于这里的优先级则是规定出来的。

priority_queue定义

其定义的写法和其他STL容器相同,typename可以是任意基本数据类型或容器

prioroty_queue<typename> name;

prority_queue容器内元素的访问

和队列不一样的是,优先队列没有front()函数与back()函数,而只能通过top()函数来访问队首元素,也就是优先级最高的元素。

#include<stdio.h>
#include<queue>
using namespace std;
int main(){priority_queue<int> q;q.push(3);q.push(4);q.push(1);printf("%d\n",q.top());return 0;
}

输出结果

4

priority_queue()常用函数实例解析

(1)push()

push(x)将令x入队,时间复杂度为O\left ( logN \right ),其中N为当前优先队列中的元素个数

(2)top()

top()可以获得队首元素,时间复杂度为O\left ( 1 \right )

(3)pop()

pop()令队首元素出队,时间复杂度为O\left ( logN \right ),其中N为当前优先队列中的元素个数。

#include<stdio.h>
#include<queue>
using namespace std;
int main(){priority_queue<int> q;q.push(3);q.push(4);q.push(1);printf("%d\n",q.top());q.pop();printf("%d\n",q.top());return 0;
}

输出结果

4
3

(4)empty()

empty()检测优先队列是否为空,返回true则空,返回false则非空,时间复杂度为O\left ( 1 \right )

#include<stdio.h>
#include<queue>
using namespace std;
int main(){priority_queue<int> q;if(q.empty()==true){printf("Empty\n");}else{printf("Not Empty\n");}q.push(1);if(q.empty()==true){printf("Empty\n");}else{printf("Not Empty\n");}return 0;
}

(5)size()

size()返回优先队列内元素的个数,时间复杂度为O\left ( 1 \right )

#include<stdio.h>
#include<queue>
using namespace std;
int main(){priority_queue<int> q;q.push(3);q.push(4);q.push(1);printf("%d\n",q.size());return 0;
}

priority_queue内元素优先级的设置

如何定义优先队列内元素的优先级是运用好优先队列的关键,下面分别介绍基本数据类型与结构体类型的优先级设置方法。

(1)基本数据类型的优先级设置

此处指的基本数据类型就是int型,double型,char型等可以直接使用的数据类型,优先队列对它们的优先级设置一般是数字大的优先级越高,因此队首元素就是优先队列内的元素最大的那个(如果char型,则是字典序最大的)。对基本数据类型来说,下面两种优先队列的定义是等价的(以int型为例)

prioroty_queue<int> q;
priority_queue<int,vector<int>,less<int> > q;

可以发现,第二种定义方式的尖括号多出了两个参数:一个是vector<int>,另一个是less<int>。其中vector<int>填写的是来承载底层数据结构堆的容器,如果第一个参数是double型或char型,则此处只需要填写vector<double>或vector<char>;而第三个参数less<int>则是对第一个参数的比较类,less<int>表示数字大的优先级越大,而greater<int>表示数字小的优先级越大

因此,如果想让优先队列总是把最小的元素放在队首,只需进行如下定义:

priority_queue<int,vector<int>,greater<int> > q;
#include<stdio.h>
#include<queue>
using namespace std;
int main(){priority_queue<int,vector<int>,greater<int> > q;q.push(3);q.push(4);q.push(1);printf("%d\n",q.top());return 0;
}

输出结果

1

事实上,即便是基本数据类型,也可以使用下面的结构体的优先级设置方法,只不过第三个参数的写法不太一样。

(2)结构体的优先级设置

可以举一个水果的例子,对水果的价格和名称建立一个结构体

struct fruit{string name;int price;
};

现在希望按水果的价格高的为优先级高,就需要重载小于号"<"。重载是指对已有的运算符进行重新定义,也就是说,可以改变小于号的功能,写法如下:

struct fruit{string name;int price;friend bool operator < (fruit f1,fruit f2){return f1.price < f2.price;}
};

可以看到,fruit结构体增加了一个函数,其中”friend"为友元,后面的”bool operator < (fruit f1,fruit f2)"对fruit类型的操作符“<"进行了重载(重载大于号会编译错误,因为从数学上来说只需要重载小于号,即f1>f2等价于判断f2<f1,而f1==f2等价于判断!(f1<f2)&&!(f2<f1),函数内部为"return f1.price<f2.price",因此重载后小于号还是小于号的作用。此时就可以直接定义fruit类型的优先队列,其内部就是以价格高的水果为优先级高。

priority_queue<fruit> q;

同理,如果想要以价格低的水果为优先级高,那么只需要把return中的小于号改为大于号即可。

struct fruit{string name;int price;friend bool operator < (fruit f1,fruit f2){return f1.price > f2.price;}
};

完整代码如下:

#include<iostream>
#include<string>
#include<queue>
using namespace std;
struct fruit{string name;int price;friend bool operator < (fruit f1,fruit f2){return f1.price > f2.price;}
}f1,f2,f3;
int main(){priority_queue<fruit> q;f1.name="桃子";f1.price=3;f2.name="梨子";f2.price=4;f3.name="苹果";f3.price=1;q.push(f1);q.push(f2);q.push(f3);cout<<q.top().name<<" "<<q.top().price<<endl;return 0;
}

输出结果

苹果 1

此处对小于号的重载与排序函数sort中的cmp函数有些相似,它们的参数都是两个变量,函数内部都是return了true或者false。事实上,这两者的作用确实是类似的,只不过效果看上去似乎是相反的。在排序中,如果return f1.price>f2.price,那么则是按照价格从高到低排序,但是在优先队列中却是把价格低的放在队首。原因在于,优先队列本身静默的规则就是优先级高的放在队首,因此把小于号重载为大于号的功能时只是把这个规则反向了一下。只需要记住,优先队列的这个函数与sort中的cmp函数的效果是相反的

或者也可以把结构体定义在外面,只需要把friend去掉,把小于号改成一对小括号,然后把重载的函数写在结构体外面,同时将其用struct包装起来。

struct cmp{bool operator () (fruit f1,fruit f2){return f1.price > f2.price;}
};

在这种情况下需要用之前讲解的第二种定义方式来定义优先队列

priority_queue<fruit,vector<fruit>,cmp> q;

完整代码如下:

#include<iostream>
#include<string>
#include<queue>
using namespace std;
struct fruit{string name;int price;
}f1,f2,f3;
struct cmp{bool operator () (fruit f1,fruit f2){return f1.price > f2.price;}
};
int main(){priority_queue<fruit,vector<fruit>,cmp> q;f1.name="桃子";f1.price=3;f2.name="梨子";f2.price=4;f3.name="苹果";f3.price=1;q.push(f1);q.push(f2);q.push(f3);cout<<q.top().name<<" "<<q.top().price<<endl;return 0;
}

当然即便是基本数据类型或者其他STL容器,也可以通过同样的方式来定义优先级。

最后指出,如果结构体内的数据较为庞大(例如出现了字符串或者数组),建议使用引用来提高效率,此时比较类的参数需要加上"const"和"&"

friend bool operator < (const fruit &f1,const fruit &f2){return f1.price > f2.price;
}
bool operator() (const fruit &f1,const fruit &f2){return f1.price > f2.price;
}

priority_queue的常见用途

priority_queue可以解决一些贪心问题,也可以对Dijkstra算法进行优化。

但是注意在使用tiop()函数前,必须用empty()判断优先队列是否为空。

相关文章:

STL库--priority_queue

目录 priority_queue定义 prority_queue容器内元素的访问 priority_queue()常用函数实例解析 priority_queue内元素优先级的设置 priority_queue的常见用途 priority_queue又称为优先队列&#xff0c;其底层是用堆来进行实现的。在优先队列中&#xff0c;队首元素一定是当…...

网络编程 —— Http使用httpClient实现页面爬虫

先去找类型的a标签 取出图片所在网址 取出https://desk.3gbizhi.com/deskMV/438.html 搭建Form界面 Http类 public static HttpClient Client { get; } static Http() {HttpClientHandler handler new HttpClientHandler();//处理消息对象//ServerCertificateCustomValidat…...

【本地运行chatgpt-web】启动前端项目和service服务端项目,也是使用nodejs进行开发的。两个都运行成功才可以使用!

1&#xff0c;启动web界面 https://github.com/Chanzhaoyu/chatgpt-web#node https://nodejs.org/en/download/package-manager # 使用nvm 安装最新的 20 版本。 curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash source /root/.bashrc n…...

TOGAF企业架构章节(核心)知识点(一)

TOGAF标准9.2一共有 6 部分&#xff1a; 第一部分&#xff08;简介&#xff09;&#xff1a;企业架构的关键概念&#xff0c;特别是 TOGAF 方法进行了概要介绍第二部分&#xff08;架构开发方法&#xff09;&#xff1a; TOGAF 框架的核心部分。描述了 TOGAF 架构开发方法&…...

手摸手教你uniapp原生插件开发

行有余力,心无恐惧 这篇技术文章写了得有两三个礼拜,虽然最近各种事情,工作上的生活上的,但是感觉还是有很多时间被浪费.还记得几年前曾经有一段时间7点多起床运动,然后工作学习,看书提升认知.现在我都要佩服那会儿的自己.如果想回到那种状态,我觉得需要有三个重要的条件. 其…...

C++进程间通信 消息队列

C进程间通信 消息队列 消息队列概述消息队列代码示例1. 创建和发送消息的程序&#xff08;sender.cpp&#xff09;2. 接收消息的程序&#xff08;receiver.cpp&#xff09; 代码解释运行步骤运行结果 消息队列概述 消息队列是一种进程间通信机制&#xff0c;允许一个或多个进程…...

mysql中InnoDB的统计数据

大家好。我们知道&#xff0c;mysql中存在许多的统计数据&#xff0c;比如通过SHOW TABLE STATUS 可以看到关于表的统计数据&#xff0c;通过SHOW INDEX可以看到关于索引的统计数据&#xff0c;那么这些统计数据是怎么来的呢&#xff1f;它们是以什么方式收集的呢&#xff1f;今…...

P459 包装类Wrapper

包装类的分类 1&#xff09;针对八种基本数据类型相应的引用类型——包装类。 2&#xff09;有了类的特点&#xff0c;就可以调用类中的方法。 Boolean包装类 Character包装类 其余六种Number类型的包装类 包装类和基本数据类型的相互转换 public class Integer01 {publi…...

Kong网关的负载均衡

安装java环境 查询 java安装包 196 yum list java* 安装java8197 yum install -y java-1.8.0-openjdk.x86_64 检验java8是否安装成功。198 java -version2个tomcat准备 另外一个tomcat区别在于&#xff1a;配置文件。conf/server.xml 启动tomcat [rootlocalhost bin]# ./…...

这是一个逗号

还不太能是句号&#xff0c;随想录这两个月算是给我一个学算法的开头&#xff0c;感慨还是挺多的&#xff0c;但是语文功底很差&#xff0c;就接着写流水账吧。 高考前想报计算机&#xff0c;但是那年是先报志愿后考试&#xff0c;家里人劝我选择更稳一点的985&#xff0c;又说…...

oracle tree

select * from "Test"; INSERT INTO "Test" ("id", "name", "pid") VALUES (01, 中国, 00); INSERT INTO "Test" ("id", "name", "pid") VALUES (01.01, 福建, 01); INSERT INTO…...

react-beautiful-dnd 横纵排序demo

简单导入就可以看到效果 1. 安装依赖 npm i react-beautiful-dnd 2. 纵向排序 import React, { useState } from react; import { DragDropContext, Droppable, Draggable } from react-beautiful-dnd;// 纵向排序 const reorder (list, startIndex, endIndex) > {con…...

web练习

[CISCN 2022 初赛]ezpop ThinkPHP V6.0.12LTS 反序列化漏洞 漏洞分析 ThinkPHP6.0.12LTS反序列漏洞分析 - FreeBuf网络安全行业门户 解题过程 ThinkPHP V6.0.12LTS反序列化的链子可以找到&#xff0c;找到反序列化的入口就行 反序列化的入口在index.php/index/test 链子 …...

模型蒸馏笔记

文章目录 一、什么是模型蒸馏二、如何蒸馏三、常见问题3.1 四、参考文献 一、什么是模型蒸馏 Hinton在NIPS2014提出了知识蒸馏&#xff08;Knowledge Distillation&#xff09;的概念&#xff0c;旨在把一个大模型或者多个模型ensemble学到的知识迁移到另一个轻量级单模型上&a…...

HAL库使用FreeRTOS实时操作系统时配置时基源(TimeBase Source)

需要另外的定时器&#xff0c;用systic的时候生成项目会有警告 https://blog.51cto.com/u_16213579/10967728...

如何让你的网站能通过域名访问

背景 当我们租一台云服务器&#xff0c;并在上面运行了一个Web服务&#xff0c;我们可以使用云服务器的公网IP地址进行访问&#xff0c;如下&#xff1a; 本文主要记录如何 实现让自己的网站可以通过域名访问。 买域名 可以登录腾讯云等主流公有云平台的&#xff0c;购买域名…...

Spring Boot + Spring Security + JWT 从零开始

Spring Boot + Spring Security + JWT 从零开始 这篇笔记中,我们将学习如何从头开始设置一个带有Spring Security的Spring Boot应用程序,它连接到一个LDAP身份验证的Spring Security身份验证提供程序,这将是即将出现的,这个连接和工作都是开箱即用的。 实际上,设置这个非…...

【busybox记录】【shell指令】rmdir

目录 内容来源&#xff1a; 【GUN】【rmdir】指令介绍 【busybox】【rmdir】指令介绍 【linux】【rmdir】指令介绍 使用示例&#xff1a; 删除空目录 - 默认 删除dirname下的所有空目录&#xff0c;包括因删除其他目录而变为空的目录 常用组合指令&#xff1a; 指令不…...

[LitCTF 2023]yafu (中级) (素数分解)

题目&#xff1a; from Crypto.Util.number import * from secret import flagm bytes_to_long(flag) n 1 for i in range(15):n *getPrime(32) e 65537 c pow(m,e,n) print(fn {n}) print(fc {c})n 152412082177688498871800101395902107678314310182046454156816957…...

MySQL alter 语句

ALTER TABLE user ADD COLUMN cdkey varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT CD-Key, ADD COLUMN erp_userid varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT ERP用户ID, ADD UNIQUE INDEX un…...

列表推导式(解析式)python

Python中的列表推导式&#xff08;list comprehension&#xff09;是一种简洁且强大的语法&#xff0c;用于创建新的列表。它允许你通过对现有列表中的元素进行操作或筛选来快速生成新列表。以下是列表推导式的基本语法和一些示例&#xff1a; 基本语法&#xff1a; new_list…...

YOLO-10更快、更强

YOLO-10简介 主要贡献&#xff1a; 无NMS的一致双分配 YOLOv10提出了一种通过双标签分配而不用非极大值抑制NMS的策略。这种方法结合了一对多和一对一分配策略的优势&#xff0c;提高了效率并保持了性能。 高效的网络设计 轻量化分类头&#xff1a;在不显著影响性能的情况下&a…...

新火种AI|寻求合作伙伴,展开豪赌,推出神秘AI项目...苹果能否突破AI困境?

作者&#xff1a;小岩 编辑&#xff1a;彩云 2024年&#xff0c;伴随着AI技术的多次爆火&#xff0c;不仅各大科技巨头纷纷进入AI赛道展开角力&#xff0c;诸多智能手机厂商也纷纷加紧布局相关技术&#xff0c;推出众多AI手机。作为手机领域的龙头老大&#xff0c;苹果自然是…...

MFC工控项目实例一主菜单制作

1、本项目用在WIN10下安装的vc6.0兼容版实现。创建项目名为SEAL_PRESSURE的MFC对话框。在项目res文件下添加相关256色ico格式图片。 2、项目名称&#xff1a;密封压力试验机 主菜单名称&#xff1a; 系统参数 SYS_DATA 系统测试 SYS_TEST 选择型号 TYP_CHOICE 开始试验 TES_STA…...

代码随想录-Day22

235. 二叉搜索树的最近公共祖先 方法一&#xff1a;两次遍历 class Solution {public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {List<TreeNode> path_p getPath(root, p);List<TreeNode> path_q getPath(root, q);TreeNode anc…...

uniapp项目 使用vue-plugin-hiprint静默打印功能

插件地址&#xff1a;https://toscode.mulanos.cn/gyy155/vue-plugin-hiprint h5项目使用插件的静默打印功能 1.下载vue-plugin-hiprint和jquery npm install vue-plugin-hiprint npm install jquery --save2.在mian.js引入插件和jqerry //引入vue-plugin-hiprint import { h…...

视频汇聚EasyCVR视频监控平台GA/T 1400协议特点及应用领域解析

GA/T 1400协议&#xff0c;也被称为视图库标准&#xff0c;全称为《公安视频图像信息应用系统》。这一标准在公安系统中具有举足轻重的地位&#xff0c;它详细规定了公安视频图像信息应用系统的设计原则、系统结构、视频图像信息对象、统一标识编码、系统功能、系统性能、接口协…...

基于似然场的快速避障算法

系列文章目录 提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加 TODO:写完再整理 文章目录 系列文章目录前言相同思想的采样概率评估快速避障算法前言 认知有限,望大家多多包涵,有什么问题也希望能够与大家多交流,共同成长! 本文先对基于似然场的快速…...

Flutter 中的 IndexedStack 小部件:全面指南

Flutter 中的 IndexedStack 小部件&#xff1a;全面指南 Flutter 是一个功能强大的 UI 框架&#xff0c;它提供了多种方式来构建动态和响应式的用户界面。IndexedStack 是 Flutter 中的一个有趣的小部件&#xff0c;它允许开发者根据索引值来显示一组子元素中的一个。这使得 I…...

基于51单片机的交通灯设计

一.硬件方案 本设计能模拟基本的交通控制系统&#xff0c;用红绿黄灯表示禁行&#xff0c;通行和等待的信号发生&#xff0c;还能进行倒计时显示。按键可以控制禁行、深夜模式、复位、东西通行、南北通行、时间加、时间减、切换等功能。共四个二位阴极数码管&#xff0c;东南西…...