C++初阶——优先队列
一、什么是优先队列
优先队列是一个容器适配器,存储于优先队列中的元素按照某种优先级自动排序。优先队列类似于堆,元素可以随时插入,但是只能弹出优先级最高的元素。默认是一个大根堆,也就是元素越大,优先级越高。
二、优先队列的定义及初始化
2.1优先队列的定义
#include <iostream>
#include <vector>
#include <queue>
#include <list>using namespace std;int main() {priority_queue<int> pq1;//创建一个默认的优先队列//默认是priority_queue<int,vector<int>,less<int>()> pq1;priority_queue<int, vector<int>, greater<int>()> pq2;//改为小根堆return 0;
}
2.2优先队列的初始化
优先队列没法像其他容器一样直接使用初始化列表进行初始化,但它可以使用其它容器的迭代器进行初始化,或者使用push函数与emplace函数依次输入函数。
#include <iostream>
#include <vector>
#include <queue>
#include <list>using namespace std;int main() {vector<int> v = { 1,2,3,4,5,6,7 };priority_queue<int> pq1(v.begin(), v.end());while (!pq1.empty()){cout << pq1.top() << " ";pq1.pop();}return 0;
}
三、list成员函数
3.1empty函数
bool empty() const;
priority_queue提供了一个成员函数empty,用于检查队列是否为空,即检查其大小是否为零。这个函数实际上是调用了底层容器对象的empty成员函数。
#include <iostream>
#include <vector>
#include <queue>
#include <list>using namespace std;int main() {vector<int> v = { 1,2,3,4,5,6,7 };list<int> l = { 1,3,4,5,6,7 };priority_queue<int> pq1(l.begin(), l.end());priority_queue<int> pq2;cout << pq1.empty() << endl;cout << pq2.empty() << endl;return 0;
}
3.2size函数
size_type size() const;
priority_queue提供了一个成员函数size,用于返回优先队列中元素的数量。这个函数实际上是调用了底层容器对象的size成员函数。
#include <iostream>
#include <vector>
#include <queue>
#include <list>using namespace std;int main() {vector<int> v = { 1,2,3,4,5,6,7 };list<int> l = { 1,3,4,5,6,7 };priority_queue<int> pq1(l.begin(), l.end());priority_queue<int> pq2;cout << pq1.size() << endl;cout << pq2.size() << endl;return 0;
}
3.3top函数
const_reference top() const;
priority_queue提供了一个成员函数top,用于返回队头即优先级最高的元素。这个函数实际上是调用了底层容器对象的front成员函数。
#include <iostream>
#include <vector>
#include <queue>
#include <list>using namespace std;int main() {vector<int> v = { 1,2,3,4,5,6,7 };list<int> l = { 1,3,4,5,6,7 };priority_queue<int> pq1(l.begin(), l.end());priority_queue<int> pq2;cout << pq1.top() << endl;pq1.pop();cout << pq1.top() << endl;return 0;
}
3.4push函数
void push (const value_type& val);
void push (value_type&& val);
priority_queue提供了一个成员函数push,用于向队列中插入一个新的元素。这个新元素的内容会被初始化为val指定的值。push函数首先调用底层容器对象的push_back成员函数来添加元素,然后通过调用heap中的算法调整容器中所有元素的范围,以确保新元素被放置在堆结构中正确的位置。
#include <iostream>
#include <vector>
#include <queue>
#include <list>using namespace std;int main() {vector<int> v = { 1,2,3,4,5,6,7 };list<int> l = { 1,3,4,5,6,7 };priority_queue<int> pq1(l.begin(), l.end());priority_queue<int> pq2;pq1.push(10);cout << pq1.top() << endl;pq1.pop();cout << pq1.top() << endl;return 0;
}
3.5emplace函数
template <class... Args> void emplace (Args&&... args);
priority_queue提供了一个成员函数emplace,它允许你在队列中就地构造一个新元素,这意味着你可以直接传递给新元素构造函数的参数,而不需要先创建一个临时对象再复制或移动到队列中。emplace函数首先调用底层容器的emplace_back成员函数来就地构造元素,然后通过调用push_heap算法调整容器中所有元素的范围,以确保新元素被放置在堆结构中正确的位置。
#include <iostream>
#include <vector>
#include <queue>
#include <list>using namespace std;int main() {vector<int> v = { 1,2,3,4,5,6,7 };list<int> l = { 1,3,4,5,6,7 };priority_queue<int> pq1(l.begin(), l.end());priority_queue<int> pq2;pq1.emplace(10);cout << pq1.top() << endl;pq1.pop();cout << pq1.top() << endl;return 0;
}
3.6pop函数
void pop();
priority_queue提供了一个成员函数pop,用于移除队列顶部的元素,也就是优先级最高的元素。这个操作会减少队列的大小一个单位。在调用pop之前,可以使用top成员函数来检索即将被移除的元素的值。
#include <iostream>
#include <vector>
#include <queue>
#include <list>using namespace std;int main() {vector<int> v = { 1,2,3,4,5,6,7 };list<int> l = { 1,3,4,5,6,7 };priority_queue<int> pq1(l.begin(), l.end());priority_queue<int> pq2;cout << pq1.top() << endl;pq1.pop();cout << pq1.top() << endl;return 0;
}
3.7成员swap函数
void swap (priority_queue& x) noexcept (/*see below*/);
priority_queue提供了一个成员函数swap,它用于交换两个priority_queue容器的元素。这个操作不仅交换了底层容器的内容,还包括它们的比较函数。这个成员函数通过调用底层容器和比较函数的swap非成员函数来实现交换。
#include <iostream>
#include <vector>
#include <queue>
#include <list>using namespace std;int main() {vector<int> v = { 1,2,3,4,5 };list<int> l = { 5,6,7,8,9 };priority_queue<int> pq1(l.begin(), l.end());priority_queue<int> pq2(v.begin(), v.end());priority_queue<int> pq3(pq1);priority_queue<int> pq4(pq2);while (!pq1.empty()){cout << pq1.top() << " ";pq1.pop();}cout << endl;while (!pq2.empty()){cout << pq2.top() << " ";pq2.pop();}cout << endl;pq3.swap(pq4);while (!pq3.empty()){cout << pq3.top() << " ";pq3.pop();}cout << endl;while (!pq4.empty()){cout << pq4.top() << " ";pq4.pop();}return 0;
}
四、非成员函数
4.1模板函数swap
template <class T, class Container, class Compare>
void swap (priority_queue<T,Container,Compare>& x, priority_queue<T,Container,Compare>& y) noexcept(noexcept(x.swap(y)));
交换两个优先队列中元素时,可以不适用成员swap函数,转而使用算法标准库中的模板swap函数。
#include <iostream>
#include <vector>
#include <queue>
#include <list>using namespace std;int main() {vector<int> v = { 1,2,3,4,5 };list<int> l = { 5,6,7,8,9 };priority_queue<int> pq1(l.begin(), l.end());priority_queue<int> pq2(v.begin(), v.end());priority_queue<int> pq3(pq1);priority_queue<int> pq4(pq2);while (!pq1.empty()){cout << pq1.top() << " ";pq1.pop();}cout << endl;while (!pq2.empty()){cout << pq2.top() << " ";pq2.pop();}cout << endl;swap(pq3,pq4);while (!pq3.empty()){cout << pq3.top() << " ";pq3.pop();}cout << endl;while (!pq4.empty()){cout << pq4.top() << " ";pq4.pop();}return 0;
}
相关文章:
C++初阶——优先队列
一、什么是优先队列 优先队列是一个容器适配器,存储于优先队列中的元素按照某种优先级自动排序。优先队列类似于堆,元素可以随时插入,但是只能弹出优先级最高的元素。默认是一个大根堆,也就是元素越大,优先级越高。 二…...
10月月报 | Apache DolphinScheduler进展总结
各位热爱 Apache DolphinScheduler 的小伙伴们,社区10月份月报更新啦!这里将记录 DolphinScheduler 社区每月的重要更新,欢迎关注! 月度Merge之星 感谢以下小伙伴10月份为 Apache DolphinScheduler 所做的精彩贡献(排…...
WSL--无需安装虚拟机和docker可以直接在Windows操作系统上使用Linux操作系统
安装WSL命令 管理员打开PowerShell或Windows命令提示符,输入wsl --install,然后回车 注意:此命令将启用运行 WSL 和安装 Linux 的 Ubuntu 发行版所需的功能。 注意:默认安装最新的Ubuntu发行版。 注意:默认安装路径是…...
《AI 之影》
《AI 之影》 城市的喧嚣如同一幅永不停息的画卷,在钢筋水泥的丛林中,人们匆忙地穿梭,追逐着各自的梦想与欲望。而在这看似平凡的都市之中,一场悄然的变革正在酝酿。 他叫佑介,一个孤独的城市漫步者。每天,他…...
QT5.14*解决QSslSocket::connectToHostEncrypted: TLS initialization faile
qDebug()<<"QSslSocket"<<QSslSocket::sslLibraryBuildVersionString();通过上述代码在QT控制台查看对应需要的SSL版本,QT5.14.*输出的内容为: OpenSSL 1.1.1d 10 Sep 2019从官方下载openssl安装包即可,在官网找了很…...
高效分支管理规范
一、目的 通过标准化的流程和最佳实践,确保代码组织清晰、版本控制高效、变更管理有序,从而提高软件开发的质量、效率和可维护性,支持团队协作和持续集成/持续部署流程,最终实现项目的长期成功和发展 二、分支命名规范 简洁明了…...
跟我学C++中级篇——RAII
一、什么是RAII Resource Acquisition Is Initialization,资源获取即初始化。C/C的开发者都知道,在这类语言的开发中,内存需要手动来控制。也就是说,释放和回收内存得开发者亲历亲为。从某种角度看,能够把控内存的细节…...
C语言第九周课——经典算法
目录 一、冒泡法排序 1.1原理 1.2代码实现(以升序排序为例) 1.3逻辑 1.4分析 二、二分法查找 2.1原理 2.2代码实现 2.3逻辑 2.4算法效率分析 三、素数判断 3.1原理 3.2代码实现 3.3逻辑 3.4分析 一、冒泡法排序 1.1原理 冒泡排序&…...
【Pikachu】XML外部实体注入实战
若天下不定,吾往;若世道不平,不回! 1.XXE漏洞实战 首先写入一个合法的xml文档 <?xml version "1.0"?> <!DOCTYPE gfzq [<!ENTITY gfzq "gfzq"> ]> <name>&gfzq;</name&…...
vue2项目中在线预览csv文件
简介 希望在项目中,在线预览.csv文件,本以为插件很多,结果都只是支持excel(.xls、.xlsx)一到.csv就歇菜。。。 关于文件预览 vue-office:文档、 查看在线演示demo,支持docx、.xlsx、pdf、ppt…...
基于VUE实现语音通话:边录边转发送语言消息、 播放pcm 音频
文章目录 引言I 音频协议音频格式:音频协议:II 实现协议创建ws对象初始化边录边转发送语言消息 setupPCM按下通话按钮时开始讲话,松开后停止讲话播放pcm 音频III 第三库recorderplayer调试引言 需求:电台通讯网(电台远程遥控软件-超短波)该系统通过网络、超短波终端等无线…...
PMP--一、二、三模、冲刺--分类--变更--技巧--特点
文章目录 一模二模三模冲刺14.敏捷--不确定性、风险和生命周期选择14.敏捷--特点--敏捷范围灵活,敏捷拥抱变更14.敏捷--阶段关口--在不同的组织、行业或工作类型中,阶段关口可能被称为阶段审查、阶段门、关键决策点和阶段入口或阶段出口。组织可以通过这…...
CSS Grid 布局实战:从入门到精通
文章目录 前言一、CSS Grid 布局概述1.1 什么是 CSS Grid 布局?1.2 主要特点 二、基本概念2.1 网格容器2.2 网格线2.3 网格轨道2.4 网格区域 三、常用属性3.1 定义网格结构3.2 控制网格项的位置3.3 控制网格间距3.4 自动填充和重复 四、实践案例4.1 项目结构4.2 HTM…...
git创建远程仓库,以gitee码云为例GitHub同理
git远程Remote服务端仓库构建的视频教程在这 Git建立服务端Remote远程仓库,gitee码云例,Github_哔哩哔哩_bilibili 1、登gitee码云/Github 登录 - Gitee.com https://github.com/ (没账号的注册一下就行) 点击如下图位置的创…...
Java爬虫(HttpURLConnection)详解
文章目录 Java爬虫(HttpURLConnection)详解一、引言二、准备工作1、环境配置2、理解HttpURLConnection 三、发送GET请求1、创建URL对象2、打开连接3、设置请求方法4、连接并读取响应5、处理返回的数据 四、发送POST请求1、设置输出2、发送请求体3、读取响…...
基于STM32的智能停车管理系统设计
引言 随着城市汽车保有量的增加,停车难问题日益严重,传统停车管理方式效率低下,无法满足现代化需求。为了解决这一问题,本项目基于STM32微控制器设计了一种智能停车管理系统。系统能够通过传感器实时监测停车位的使用情况&#x…...
【循环神经网络】
循环神经网络(Recurrent Neural Network, RNN)是一类用于处理序列数据的神经网络,擅长处理具有时间依赖或顺序结构的数据。RNN通过循环连接的结构,使得当前时刻的输出可以受之前时刻信息的影响,因此被广泛应用于自然语…...
优选算法 - 4 ( 链表 哈希表 字符串 9000 字详解 )
一:链表 1.1 链表常用技巧和操作总结 1.2 两数相加 题目链接:两数相加 /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode() {}* ListNode(int val) { this.val val; }* …...
CTF-RE 从0到N: windows反调试-获取Process Environment Block(PEB)信息来检测调试
在Windows操作系统中,Process Environment Block (PEB,进程环境块) 是一个包含特定进程信息的数据结构。它可以被用于反调试中 如何获取PEB指针? 在Windows操作系统中,获取PEB指针的常见方法主要有以下几种。: 1. 使…...
STM32开发基础阶段复习
1.使用寄存器方式点亮LED灯的三个步骤是什么? 首先使能RCC_APB2ENR(外设时钟使能寄存器)对应的GPIO端口时钟,即给LED这个外设使能时钟。 配置对应GPIO端口,配置为通用推挽输出,输出速度可以选择最大。 将GPIO端口输…...
[2025CVPR]DeepVideo-R1:基于难度感知回归GRPO的视频强化微调框架详解
突破视频大语言模型推理瓶颈,在多个视频基准上实现SOTA性能 一、核心问题与创新亮点 1.1 GRPO在视频任务中的两大挑战 安全措施依赖问题 GRPO使用min和clip函数限制策略更新幅度,导致: 梯度抑制:当新旧策略差异过大时梯度消失收敛困难:策略无法充分优化# 传统GRPO的梯…...
Vue3 + Element Plus + TypeScript中el-transfer穿梭框组件使用详解及示例
使用详解 Element Plus 的 el-transfer 组件是一个强大的穿梭框组件,常用于在两个集合之间进行数据转移,如权限分配、数据选择等场景。下面我将详细介绍其用法并提供一个完整示例。 核心特性与用法 基本属性 v-model:绑定右侧列表的值&…...
JVM垃圾回收机制全解析
Java虚拟机(JVM)中的垃圾收集器(Garbage Collector,简称GC)是用于自动管理内存的机制。它负责识别和清除不再被程序使用的对象,从而释放内存空间,避免内存泄漏和内存溢出等问题。垃圾收集器在Ja…...
04-初识css
一、css样式引入 1.1.内部样式 <div style"width: 100px;"></div>1.2.外部样式 1.2.1.外部样式1 <style>.aa {width: 100px;} </style> <div class"aa"></div>1.2.2.外部样式2 <!-- rel内表面引入的是style样…...
LLM基础1_语言模型如何处理文本
基于GitHub项目:https://github.com/datawhalechina/llms-from-scratch-cn 工具介绍 tiktoken:OpenAI开发的专业"分词器" torch:Facebook开发的强力计算引擎,相当于超级计算器 理解词嵌入:给词语画"…...
NFT模式:数字资产确权与链游经济系统构建
NFT模式:数字资产确权与链游经济系统构建 ——从技术架构到可持续生态的范式革命 一、确权技术革新:构建可信数字资产基石 1. 区块链底层架构的进化 跨链互操作协议:基于LayerZero协议实现以太坊、Solana等公链资产互通,通过零知…...
Redis数据倾斜问题解决
Redis 数据倾斜问题解析与解决方案 什么是 Redis 数据倾斜 Redis 数据倾斜指的是在 Redis 集群中,部分节点存储的数据量或访问量远高于其他节点,导致这些节点负载过高,影响整体性能。 数据倾斜的主要表现 部分节点内存使用率远高于其他节…...
在Mathematica中实现Newton-Raphson迭代的收敛时间算法(一般三次多项式)
考察一般的三次多项式,以r为参数: p[z_, r_] : z^3 (r - 1) z - r; roots[r_] : z /. Solve[p[z, r] 0, z]; 此多项式的根为: 尽管看起来这个多项式是特殊的,其实一般的三次多项式都是可以通过线性变换化为这个形式…...
【LeetCode】算法详解#6 ---除自身以外数组的乘积
1.题目介绍 给定一个整数数组 nums,返回 数组 answer ,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法,且在 O…...
如何配置一个sql server使得其它用户可以通过excel odbc获取数据
要让其他用户通过 Excel 使用 ODBC 连接到 SQL Server 获取数据,你需要完成以下配置步骤: ✅ 一、在 SQL Server 端配置(服务器设置) 1. 启用 TCP/IP 协议 打开 “SQL Server 配置管理器”。导航到:SQL Server 网络配…...
