【C++初阶】第14课—缝合怪deque和优先队列、仿函数
文章目录
- 1. 双端队列deque
- 1.1 认识deque
- 1.2 deque的迭代器
- 1.3 deque的常用接口
- 1.4 deque的优缺点
- 2. 优先队列priority_queue
- 2.1 认识priority_queue
- 2.2 模拟实现优先队列priority_queue
- 3. 仿函数
- 在学习deque之前,回顾一下vector和list各自的优缺点
| 数据结构 | 优点 | 缺点 |
|---|---|---|
| vector | 支持下标随机访问 | 中间或头部插入删除效率低/扩容有一定的消耗,可能存在空间的浪费 |
| list | 支持任意位置的插入删除/按需扩容或释放,不存在空间浪费 | 不支持随机访问 |
1. 双端队列deque
1.1 认识deque
- 前面学过了vector和list,不过两个容器各有各的优点,后来就衍生出集合两者优点的deque
- 由于deque只是简单的将两者的优点结合,因此它也被称为缝合怪

- deque是一种双开口的“连续”空间的数据结构,但从物理结构上将,其实它只是一段一段连续的物理空间片段拼接而成的,并非整段都是连续的

1.2 deque的迭代器
- 想要理解deque的结构,重中之重就要了解它的迭代器是如何作用的

- deque整个的工作原理

- 有了以上理解后,如果deque尾插元素时,判断first等不等于end(),等于说明该buffer数组满了,需要扩容,然后finish迭代器的cur和first指向下个buffer数组的首元素位置,last指向下个buffer数组的尾元素下个位置,此时node也得更新,它得指向map有效元素的下个位置,map满了的话也得扩容,这样就避免了插入元素时需要频繁扩容的困扰
- 需要注意的是deque的头插

- deque的下标随机访问

1.3 deque的常用接口

1.4 deque的优缺点
| 优点 | 缺点 | |
|---|---|---|
| deque | 头部插入删除数据时,与vector相比,不需要额外移动数据;扩容时,不需要开辟大量的空间;与list相比,deque底层空间是"连续"的,空间的利用率比较高 | 不适用与遍历,因为它遍历时需要通过迭代器频繁检查每个buffer数组的边界,效率低下 |
- 因此deque通常不会去使用它,除非在某些特定的场景下

- 这里stack和queue的模版默认给的是deque,这是因为stack是"先进后出"的数据结构,它的常用接口也就是push_back()和pop_back(),这对于deque来说,刚好对应上其优点,deque在头部插入删除效率明显要高于vector
- 而对于queue来讲,它是"先进先出"的数据结构,而deque是双端队列,在头部尾部插入/删除数据消耗也少,内存使用率也高
- 对于双端队列deque来说,其应用场景目前就是作为stack和queue的底层默认容器
2. 优先队列priority_queue
2.1 认识priority_queue
- 优先级队列默认使用vector作为其底层存储数据的容器,在vector上又使用了堆算法将vector中元素构造成堆的结构,因此priority_queue就是堆,所有需要用到堆的位置,都可以考虑使用priority_queue。注意:默认情况下priority_queue是大堆。

- priority_queue的常用接口


- 如果要实现队列中所有元素按照升序排列呢?

2.2 模拟实现优先队列priority_queue
- 首先优先级队列默认是一个大堆,入队列出队列主要依靠向上向下调整算法
- 入队列

- 出队列

- 代码
#include <deque>
#include <vector>
using namespace std;namespace PQ
{template<class T,class Container = vector<T>>class Priority_Queue{public://向上调整算法void adjust_up(size_t child){size_t parent = (child - 1) / 2;while (child > 0){if (_con[parent] < _con[child]){swap(_con[parent], _con[child]);child = parent;parent = (child - 1) / 2;}elsebreak;}}//向下调整算法void adjust_down(size_t parent){size_t child = parent * 2 + 1;while (child < _con.size()){//优先找最小的孩子if (child + 1 < _con.size() && _con[child + 1] > _con[child]){++child;}//对比最小孩子和父节点if (_con[parent] < _con[child]){swap(_con[parent], _con[child]);parent = child;child = parent * 2 + 1;}//有序elsebreak;}}void push(const T& x){_con.push_back(x);adjust_up(_con.size() - 1);}void pop(){swap(_con[0], _con[_con.size() - 1]);_con.pop_back();adjust_down(0);}const T& top(){return _con[0];}bool empty(){return _con.empty();}size_t size() const{return _con.size();}private:Container _con;};
}
3. 仿函数
- 这里先简单了解下仿函数,其实就是重载小括号运算符
- 仿函数是一个定义了 operator()的类或结构体实例。通过重载 operator(),你可以为对象定义调用时的行为,使其表现得像一个函数。


- 当然,使用仿函数有时也会达不到预期效果



相关文章:
【C++初阶】第14课—缝合怪deque和优先队列、仿函数
文章目录 1. 双端队列deque1.1 认识deque1.2 deque的迭代器1.3 deque的常用接口1.4 deque的优缺点 2. 优先队列priority_queue2.1 认识priority_queue2.2 模拟实现优先队列priority_queue 3. 仿函数 在学习deque之前,回顾一下vector和list各自的优缺点 数据结构优点…...
方德桌面操作系统V5.0-G23安装Docker并配置DockerHub镜像加速器
为什么要使用debina的docker源,因为查询os-release和uname 显示是基于debina 11的操作系统 rootyuhua-virtualmachine:~# cat /etc/os-release NAME"方德桌面操作系统" NAME_EN"NFSDesktop" VERSION"5.0" VERSION_ID"5.0"…...
parameter和localparam的区别(verilog中)
在Verilog中,parameter 和 localparam 都用于定义常量,但是它们之间有一些重要的区 作用范围: parameter:可以在模块外部被修改或重定义。它可以被作为模块的参数传递给其他模块,因此具有较广泛的作用范围,…...
紫光同创FPGA实现HSSTLP光口视频点对点传输,基于Aurora 8b/10b编解码架构,提供6套PDS工程源码和技术支持
目录 1、前言工程概述免责声明 2、相关方案推荐我已有的所有工程源码总目录----方便你快速找到自己喜欢的项目紫光同创FPGA相关方案推荐我这里已有的 GT 高速接口解决方案Xilinx系列FPGA实现GTP光口视频传输方案推荐Xilinx系列FPGA实现GTX光口视频传输方案推荐Xilinx系列FPGA实…...
数字孪生城市技术应用典型实践案例汇编(22个典型案例)(附下载)
近年来,数字孪生技术在我国从战略框架逐步向系统性落地推进,成为推动数字中国建设的重要技术引擎。随着《数字中国建设整体布局规划》《"十四五"数字经济发展规划》《深化智慧城市发展推进城市全域数字化转型的指导意见》等政策的实施…...
主流物理仿真引擎和机器人/强化学习仿真平台对比
以下是当前主流的物理仿真引擎和机器人/强化学习仿真平台的特点和适用场景,方便根据需求选择: 🧠 NVIDIA 系列 ✅ Isaac Lab v1.4 / v2 特点: 基于 Omniverse Isaac Sim,属于高端视觉机器人仿真框架v2 更加模块化&a…...
Hyperf (Swoole)的多进程 + 单线程协程、Gin (Go)Go的单进程 + 多 goroutine 解说
1. 核心概念解析 (1) Hyperf (Swoole): 多进程 单线程协程 Swoole 并发模型详解 Swoole 的并发模型基于多进程架构,每个进程是单线程的,线程内运行多个协程。以下是其结构的关键点: 多进程:Swoole 应用程序启动时,…...
Intel(R) Wi-Fi 6 AX201 160MHz
本文来源 : 腾讯元宝 Intel(R) Wi-Fi 6 AX201 160MHz 是一款支持最新 Wi-Fi 6(802.11ax)标准的无线网卡,专为现代笔记本电脑和台式机设计。以下是其主要特点和规格: 主要特性: Wi-Fi …...
Java 工厂设计模式详解:用统一入口打造灵活可扩展的登录系统----掌握 Spring 源码的基础第一步
一、前言 在实际开发中,我们经常面临以下场景: 系统支持多种登录方式(用户名密码、管理员登录、OAuth 登录、短信登录等) 每种登录方式的认证逻辑不同 我们希望对外提供一个统一的接口调用,而不暴露具体实现 这个…...
Spring Boot管理Spring MVC
Spring Boot真正的核心功能是自动配置和快速整合,通常Spring Boot应用的前端MVC框架依然使用Spring MVC。Spring Boot提供的spring-boot-starter-web启动器嵌入了Spring MVC的依赖,并为Spring MVC提供了大量自动配置,可以适用于大多数Web开发…...
在 Kali Linux 上安装 Java OpenJDK 8(详细指南)
前置知识 Kali Linux:本文假设你使用的是最新版本的 Kali Linux,且具有管理员权限(sudo 或 root 权限)。OpenJDK 8:OpenJDK 是 Java Development Kit (JDK) 的开源实现,包含运行 Java 程序所需的 Java Run…...
Windows单机模拟MySQL主从复制
这里写自定义目录标题 下载MySQL ZIP压缩包安装主库1、创建配置文件2、安装服务3、初始化数据库4、启动服务5、配置主库 安装从库1、配置ini文件2、安装服务3、初始化数据库4、启动服务5、配置从库6、验证从库状态 操作主库验证 下载MySQL ZIP压缩包 https://dev.mysql.com/do…...
Wifi密码查看软件V1.0
⭐本软件用于查看电脑连接过所有WiFi密码,不具备破解功能。 可在忘记WiFi密码或他人输入密码自己不知道的情况下使用。 ⭐⭐为便于快速分享,加入双击【密码】列可将WIFI密码复制在粘贴板。 ⭐⭐⭐双击【名称】列可生成用于手机连接的二维码进行显示&…...
分布式日志治理:Log4j2自定义Appender写日志到RocketMQ
🧑 博主简介:CSDN博客专家,历代文学网(PC端可以访问:https://literature.sinhy.com/#/?__c1000,移动端可微信小程序搜索“历代文学”)总架构师,15年工作经验,精通Java编…...
【口腔粘膜鳞状细胞癌】文献阅读3
文献 Single-cell transcriptomic analysis uncovers the origin and intratumoral heterogeneity of parotid pleomorphic adenoma 单细胞转录组学分析揭示了腮腺多形性腺瘤的起源和瘤内异质性 IF:10.8中科院分区:1区 医学WOS分区:Q1 摘要 多形性腺瘤 (PA&#…...
【2025“华中杯”大学生数学建模挑战赛】C题:就业状态分析与预测 详细解题思路
目录 2025“华中杯”大学生数学建模挑战赛C题 详细解题思路一、问题一1.1 问题分析1.2 数学模型 1.3 Python代码1.4 Matlab代码 二、问题二2.1 问题分析2.2 数学模型 2.3 Python代码2.4 Matlab代码 三、问题三3.1 问题分析 四、问题四4.1 问题分析与数学模型 2025“华中杯”大学…...
扫雷-C语言版
C语言扫雷游戏设计(完整版) 游戏背景 扫雷是一款经典的益智类单人电脑游戏,最早出现在1960年代,并在1990年代随着Windows操作系统而广为人知。游戏目标是在不触发任何地雷的情况下,揭开所有非地雷的格子。玩家需要根…...
【fisco bcos】基于ABI调用智能合约
参考官方文档:https://fisco-bcos-documentation.readthedocs.io/zh-cn/latest/docs/sdk/java_sdk/assemble_transaction.html 先放一下智能合约: (就是一个很简单的插入和查找嗯) pragma solidity ^0.4.25; pragma experimental…...
Delphi Ini文件对UTF8支持不爽的极简替代方案
如题,没太多废话,直接复制走即可。 unit uConfig;interfaceuses classes, Sysutils;typeTConfig class privateFFileName: String;FConfig:TStringList; protectedpublicconstructor Create(ConfigFile:String);destructor Destroy;property FileName…...
【LangChain实战】构建下一代智能问答系统:从RAG架构到生产级优化
打破传统问答系统的次元壁 当ChatGPT在2022年掀起AI革命时,开发者们很快发现一个残酷现实:通用大模型在专业领域的表现如同拿着地图的盲人,既无法理解企业私有数据,也无法保证事实准确性。这催生了RAG(检索增强生成&a…...
C++编译与链接:从源码到可执行文件的魔法之旅(Visual Studio实践)
文章目录 **C++编译与链接:从源码到可执行文件的魔法之旅(Visual Studio实践)****一、C++编译器的工作流程****二、Visual Studio环境配置实战****三、示例项目:Hello World全流程解析****四、高级技巧与工具链****五、总结与参考资料**C++编译与链接:从源码到可执行文件的…...
RL中的rollout和episode的区别请问是啥
很好的问题兄弟,rollout 和 episode 在强化学习(RL)里经常一起出现,虽然有重叠,但含义和使用语境还是有区别的: ✅ 一句话总结: Episode 是一个完整的任务过程(从起点到终点…...
个人博客系统后端 - 用户信息管理功能实现指南(上)
本文记录了如何实现用获取户信息,用户信息更新,用户头像上传三大基础功能 先上接口实现截图: 一、项目结构概览 先介绍一下 个人博客系统采用了标准的 Spring Boot 项目结构,用户功能相关的文件主要分布在以下几个目录:…...
判断一个整数是否为素数
#include <stdio.h> #include <stdbool.h> // 引入布尔类型// 函数声明:判断一个整数是否为素数 bool isPrime(int num);int main() {int number;// 提示用户输入一个整数printf("请输入一个整数:");scanf("%d", &n…...
具身智能机器人学习路线全解析
一、引言 具身智能机器人作为融合了机器人学、人工智能、认知科学等多领域知识的前沿技术,正逐渐改变着我们的生活和工作方式。从工业制造到家庭服务,从医疗护理到太空探索,具身智能机器人都展现出了巨大的潜力。对于想要深入了解和学习这一…...
虚幻基础:ue引擎的碰撞
文章目录 碰撞:碰撞体间 运动后 产生碰撞的行为——由引擎负责,并向各自发送事件忽略重叠阻挡 碰撞体类型模式纯查询:不清楚具体作用可以阻挡 actor碰撞(武器:刀/子弹)子组件可以产生阻挡 角色的碰撞只有根组件可以阻挡࿰…...
写项目时一些疑惑:组件间的通信、createDownloadUrl和DownloadUrl,ArrayBuffer与Blob等
目录 一、[vite] Internal server error: No known conditions for "./lib/locale/lang/zh-cn" specifier in "element-plus" package 二、可以用vue和JS的代码片段,但是用不了html的代码片段 三、meta是什么东西 四、为什么代码保持一致,但是时间轴始…...
TAS启动与卸载
3. 启动TAS(Thin-Agent服务) TAS在安装完成后通常会自动启动,并在系统重启时自启。如需手动启动,请按以下步骤操作:  3.1 在Windows上启动TAS 1. 打开 Windows服务管理器: ◦ 按下 Win R&…...
对抗生成进化:基于DNA算法的AIGC检测绕过——让AI创作真正“隐形“
一、技术背景与核心思想 2025年,AIGC检测工具(如Originality.AI 5.0)的识别准确率已达99.3%。本研究提出基于染色体编码的对抗进化框架(CAEF),通过模拟生物进化过程动态优化生成模型,成功将检测…...
手动关闭ArcGIS与ArcGIS Online连接的方法
【关闭软件启动时ArcGIS与ArcGIS Online连接方法】 打开C盘找到文件夹“C:\Program Files (x86)\Common Files\ArcGIS\bin”,如下图,删除“ArcGISConnection.exe”与“ArcGISConnectionTest.exe”文件,软件下次启动的时候就不会建立与ArcGIS …...
