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端口输…...
国防科技大学计算机基础课程笔记02信息编码
1.机内码和国标码 国标码就是我们非常熟悉的这个GB2312,但是因为都是16进制,因此这个了16进制的数据既可以翻译成为这个机器码,也可以翻译成为这个国标码,所以这个时候很容易会出现这个歧义的情况; 因此,我们的这个国…...
大话软工笔记—需求分析概述
需求分析,就是要对需求调研收集到的资料信息逐个地进行拆分、研究,从大量的不确定“需求”中确定出哪些需求最终要转换为确定的“功能需求”。 需求分析的作用非常重要,后续设计的依据主要来自于需求分析的成果,包括: 项目的目的…...
【WiFi帧结构】
文章目录 帧结构MAC头部管理帧 帧结构 Wi-Fi的帧分为三部分组成:MAC头部frame bodyFCS,其中MAC是固定格式的,frame body是可变长度。 MAC头部有frame control,duration,address1,address2,addre…...
线程与协程
1. 线程与协程 1.1. “函数调用级别”的切换、上下文切换 1. 函数调用级别的切换 “函数调用级别的切换”是指:像函数调用/返回一样轻量地完成任务切换。 举例说明: 当你在程序中写一个函数调用: funcA() 然后 funcA 执行完后返回&…...
根据万维钢·精英日课6的内容,使用AI(2025)可以参考以下方法:
根据万维钢精英日课6的内容,使用AI(2025)可以参考以下方法: 四个洞见 模型已经比人聪明:以ChatGPT o3为代表的AI非常强大,能运用高级理论解释道理、引用最新学术论文,生成对顶尖科学家都有用的…...
C# 求圆面积的程序(Program to find area of a circle)
给定半径r,求圆的面积。圆的面积应精确到小数点后5位。 例子: 输入:r 5 输出:78.53982 解释:由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982,因为我们只保留小数点后 5 位数字。 输…...
听写流程自动化实践,轻量级教育辅助
随着智能教育工具的发展,越来越多的传统学习方式正在被数字化、自动化所优化。听写作为语文、英语等学科中重要的基础训练形式,也迎来了更高效的解决方案。 这是一款轻量但功能强大的听写辅助工具。它是基于本地词库与可选在线语音引擎构建,…...
论文笔记——相干体技术在裂缝预测中的应用研究
目录 相关地震知识补充地震数据的认识地震几何属性 相干体算法定义基本原理第一代相干体技术:基于互相关的相干体技术(Correlation)第二代相干体技术:基于相似的相干体技术(Semblance)基于多道相似的相干体…...
uniapp手机号一键登录保姆级教程(包含前端和后端)
目录 前置条件创建uniapp项目并关联uniClound云空间开启一键登录模块并开通一键登录服务编写云函数并上传部署获取手机号流程(第一种) 前端直接调用云函数获取手机号(第三种)后台调用云函数获取手机号 错误码常见问题 前置条件 手机安装有sim卡手机开启…...
【JVM】Java虚拟机(二)——垃圾回收
目录 一、如何判断对象可以回收 (一)引用计数法 (二)可达性分析算法 二、垃圾回收算法 (一)标记清除 (二)标记整理 (三)复制 (四ÿ…...
