【C++】学习STL中的stack和queue
❤️前言
今天这篇博客的内容主要关于STL中的stack、queue和priority_queue三种容器。
正文
stack和queue的使用方式非常简单,我们只要根据之前学习数据结构的经验和文档介绍就可以轻松上手。于是我们直接开始对它们的模拟实现。
stack和queue的模拟实现
stack和queue我们在数据结构阶段就曾经学习过,它们的底层结构都可以基于其他的基本数据结构进行实现。这时候我们就可以用到上篇文章中提到过的适配器模式来实现这两个模板。
实现方式只要遵从栈和队列的规则即可,代码如下:
template<typename T, typename Container = deque<T>>
class stack
{
public:bool empty() const{return _con.size() == 0;}size_t size() const{return _con.size();}T& top(){return *(--_con.end());}const T& top() const{return *(--_con.end());}void push(const T& x){_con.insert(_con.end(), x);}void pop(){_con.erase(--_con.end());}private:Container _con;
};template<typename T, typename Container = deque<T>>
class queue
{
public:void push(const T& x){_con.insert(_con.end(), x);}void pop(){_con.erase(_con.begin());}T& back(){return *(--_con.end());}const T& back() const{return *(--_con.end());}T& front(){return *(_con.begin());}const T& front() const{return *(_con.begin());}size_t size() const{return _con.size();}bool empty() const{return _con.size() == 0;}
private:Container _con;
};
这里我们在使用这两个模板的时候可以传入两个模板参数,分别为数据类型和空间适配器类型,对于stack这样的容器,我们可以传入vector作为空间适配器,因为它的规则是后进先出,我们只需要关注尾插尾删即可,这样使用vector的效率是很高的。同理,我们在使用queue时可以传入list作为空间适配器。使用了适配器模式,我们的代码更加的简洁高效。
除此之外,这里我们需要简单了解一下双端队列(deque),也就是上面给出的默认空间适配器。deque结合了数组和链表的特点,本来是设计出来准备替代它们的产物,但是显而易见,它失败了(不然现在我们就不会学数组和链表了)。作为结合数组和链表的产物,它的随机访问效率低于vector,中间插入删除效率也很低,虽然它缓解了一些vector和list本身的问题,但是它总归替代不了vector和list。可以说,deque的优势就是头插头删、尾插尾删效率很高,这非常适合用来适配stack和queue。
优先级队列priority_queue
优先级队列(priority_queue)在数据结构中对应我们之前学的数据结构中的堆,堆的使用也非常简单,我们只要大概看看文档即可。除此之外堆根据堆内元素之间的关系被分为大根堆和小根堆,堆的堆顶元素是整个堆中的最值,这可以帮我们解决经典的Top-k问题。
优先级队列的模拟实现
在数据结构二叉树的学习阶段我们已经实现过堆的各种接口,只要稍加改动设计就成了一个优先级队列的模板,代码实现如下:
template<typename T, typename Container = std::vector<T>, typename Compare = std::less<T>>
class priority_queue
{
private:void AdjustDown(int parent){int child = 2 * parent + 1;while (child < _con.size()){if (child + 1 < _con.size() && _cmp(_con[child], _con[child+1])) child++;if (_cmp(_con[parent], _con[child])){std::swap(_con[parent], _con[child]);parent = child;child = 2 * parent + 1;}else{break;}} }void AdjustUp(int child){int parent = (child - 1) / 2;while (parent >= 0){if (_cmp(_con[parent], _con[child])){std::swap(_con[parent], _con[child]);child = parent;parent = (child - 1) / 2;}else{break;}}}
public:priority_queue() {}template <typename InputIterator>priority_queue(InputIterator first, InputIterator last){while (first != last){_con.insert(_con.end(), *first);first++;}}bool empty() const{return _con.empty();}size_t size() const{return _con.size();}const T& top() const{return *(_con.begin());}void push(const T& x){_con.insert(_con.end(), x);AdjustUp(_con.size() - 1);}void pop(){std::swap(_con[0], _con[_con.size() - 1]);_con.erase(--_con.end());AdjustDown(0);}private:Container _con;Compare _cmp;
};
首先我们看到优先级队列有三个模板参数,除了存储数据类型以外,还有空间适配器和仿函数。空间适配器想必大家比较熟悉了,对于堆来说,比较适合的类型就是数组vector。仿函数之前大家没有遇到过,这里为大家附上一个博客链接,大家可以看看:
C++ 仿函数_仿函数 c++_恋喵大鲤鱼的博客-CSDN博客
https://blog.csdn.net/K346K346/article/details/82818801 简单来说,仿函数就是一类可以当作函数使用的类,它具有和函数指针类似的作用,让我们可以轻松地控制生成许多效果不同的类,减少了代码冗余。
而在优先级队列中,这个仿函数的作用是比较堆节点的大小关系,于是通过改变仿函数的种类,我们能够控制大小堆以及元素间比较的方式,优先级队列的默认仿函数为less,也就是默认的大根堆,这点需要注意。
当然,在实现优先级队列的过程中,调整位置的算法是比较难的点,也希望大家能够多加练习巩固。
🍀结语
以上就是今天博客的所有内容啦,希望能够帮助到大家。
相关文章:
【C++】学习STL中的stack和queue
❤️前言 今天这篇博客的内容主要关于STL中的stack、queue和priority_queue三种容器。 正文 stack和queue的使用方式非常简单,我们只要根据之前学习数据结构的经验和文档介绍就可以轻松上手。于是我们直接开始对它们的模拟实现。 stack和queue的模拟实现 stack和q…...
Java捕获异常
在Java中,凡是可能抛出异常的语句,都可以用try ... catch捕获。把可能发生异常的语句放在try { ... }中,然后使用catch捕获对应的Exception及其子类。 使用try ... catch ... finally时: 多个catch语句的匹配顺序非常重要…...
【LLM】快速开始 LangChain
theme: orange LangChain是一个软件开发工具包,它通过将组件链接在一起并公开简单统一的API,简化了大型语言模型和应用程序的集成。本篇文章将会简要介绍,让各位开发者对其有一个整体的认识。 前言 如果你是一名软件开发人员,努力…...
Unity中立体声平移的应用
实现的效果 若从左声道开始,播放效果逐渐从左声道过渡到右声道,再从右声道过渡到左声道,具体效果请戴上耳机播放下列视频。 StereoPanning 代码实现 public class AudioInfo {[HideInInspector] public float[] StereoTranslationValues;//立…...
jupyter常用的方法以及快捷键
选中状态 蓝色 按enter 进入编辑状态 编辑状态 绿色 按Esc 进入选中状态 Code模式运行是运行代码 Markdown模式运行是进入预览状态 - - - 是文本格式的一种精简的语法形式 Raw NBConvert 是默认文本状态 - - - 输入什么样 展示什么样 Y - - - 切换code模式 M - - - 切换Markdo…...
SQL Server 操作JSON数据库列
Sql Server 从 2016 开始支持了一些 json 操作,但在SqlServer中Json还是被存储为字符串,如下: use [tempdb]declare JSON nvarchar(max) set JSONN{"id": "WakefieldFamily","parents": [{ "familyName&q…...
拼多多开放平台的API接口可以获取拼多多电商数据。以下是API接口流程
使用拼多多开放平台的API接口可以获取拼多多电商数据。以下是一般的API接口流程: 1. 注册开发者账号:首先,您需要在拼多多开放平台注册一个开发者账号。通过开发者账号,您可以获得API密钥和其他必要的信息。 2. 鉴权与认证&…...
使用Docker安装和部署kkFileView
🎈1 参考文档 kkFileView官方文档 🚀2 安装kkFileView 拉取Redis镜像。 docker pull keking/kkfileview启动docker容器。 docker run -it -d -p 8012:8012 keking/kkfileview --restart always解释: docker run redis # 从kkfileview镜像运行…...
胆囊结石3mm严重吗(解析胆囊结石的危害和处理方法)
胆囊结石是指胆囊内形成的固体结晶,大小不一,主要由胆固醇、胆汁色素和钙盐等物质组成。胆囊结石是一种比较常见的疾病,据统计,我国胆囊结石的患病率约为5%~10%左右。那么,胆囊结石3mm严重吗?下面就来一起了解一下。 …...
全新UI站长在线工具箱系统源码带后台开源版
该系统的全开源版本可供下载,并且支持暗黑模式。 系统内置高达72种站长工具、开发工具、娱乐工具等功能。此系统支持本地调用API,同时还自带免费API接口, 是一个多功能性工具程序,支持后台管理、上传插件、添加增减删功能。 环…...
maven的依赖下载不下来的几种解决方法
前言 每次部署测试环境,从代码库拉取代码,都会出现缺少包的情况。然后找开发一通调试,到处拷包。 方案一:pom文件注释/取消注释 注释掉pom.xml里的报红色的依赖(同时可以把本地maven库repo里对应的包删除)&…...
CAR-T商品化的第一步
1、CAR-T细胞的体外扩增能力 CAR-T细胞疗法需要先从患者体内获得T淋巴细胞,然后通过体外转基因技术 transduce CAR靶向结构域。这一过程需要在细胞培养体系中得到充分的扩增,以获得足够的治疗CAR-T细胞数量。因此,CAR-T细胞的体外扩增能力直…...
yolov2相较于yolov1的改进
目录 前言 BN层取代了Dropout 使用了高分辨率分类器 K-means选定先验框的尺寸 网络结构—darknet19 细粒度的特征 前言 yolov2是在yolov1的基础上进行改进的,主要解决了yolov1定位不准确以及检测重叠的物体极差的情况,总的来说,它有以下…...
如何在Spring Boot应用中使用Nacos实现动态更新数据源
🌷🍁 博主猫头虎 带您 Go to New World.✨🍁 🦄 博客首页——猫头虎的博客🎐 🐳《面试题大全专栏》 文章图文并茂🦕生动形象🦖简单易学!欢迎大家来踩踩~🌺 &a…...
代码随想录算法训练营day1~18总结
时间、空间复杂度,解题过程中运用的函数补充说明 数组 day1: http://t.csdn.cn/dBSgY day2: http://t.csdn.cn/JTDvH 数组总结 链表 day3:http://t.csdn.cn/mJx9V day4:http://t.csdn.cn/qiGqz 链表总结 哈希表 day6:…...
【炼气境】HashMap原理以及如何使用
系列文章目录 文章目录 系列文章目录前言1、数据结构2、工作原理3、当两个对象的 hashCode 相同会发生什么?4、你知道 hash 的实现吗?为什么要这样实现?5、为什么要用异或运算符?6、HashMap 的 table 的容量如何确定?l…...
QT基础教程之七Qt消息机制和事件
QT基础教程之七Qt消息机制和事件 事件 事件(event)是由系统或者 Qt 本身在不同的时刻发出的。当用户按下鼠标、敲下键盘,或者是窗口需要重新绘制的时候,都会发出一个相应的事件。一些事件在对用户操作做出响应时发出,…...
Python入门自学进阶-Web框架——40、redis、rabbitmq、git——3
git,一个分布式的版本管理工具。主要用处:版本管理、协作开发。 常见版本管理工具: VSS —— Visual Source Safe CVS —— Concurrent Versions System SVN —— CollabNet Subversion GIT GIT安装:下载安装文件:…...
skywalking agent监控java服务
一、前言 skywalking agent可以监控的服务类型有多种,python、go、java、nodejs服务等都可以监控,现在通过java服务来演示skywalking agent的使用,并且是使用容器的方式实现 二、部署skywalking agent监控 需要注意,skywalking…...
LARGE LANGUAGE MODEL AS AUTONOMOUS DECISION MAKER
本文是LLM系列文章,针对《LARGE LANGUAGE MODEL AS AUTONOMOUS DECISION MAKER》的翻译。 作为自主决策者的大语言模型 摘要1 引言2 前言3 任务形式化4 方法5 实验6 相关工作7 结论 摘要 尽管大型语言模型(LLM)表现出令人印象深刻的语言理解…...
ICLR 2026 | 告别Top-K检索!RF-Mem在嵌入空间逐步重构证据链,实现长记忆渐进式唤醒
今天分享一篇来自大连理工大学、香港城市大学、华为和中国科学技术大学的最新工作 RF-Mem,发表于ICLR 2026。这篇工作关注个性化大模型中的一个关键问题:当用户历史越来越长时,模型到底该怎样从海量记忆里,准确找回“此时此刻最相…...
如何将笔记从 iCloud 传输到 iPhone:分步指南
iPhone 上的“备忘录”应用是一款便捷的工具,可以用来记录待办事项、日记、想法等等。它能帮助我们追踪需要完成的事情。借助 iCloud 的自动同步功能,你的备忘录可以安全地存储在云端,并可通过任何 Apple 设备甚至电脑访问。将笔记从 iPhone …...
2026 Global Ion Exchange Resin Systems Market Trends:关税扰动下的工程水处理系统重构与产业链迁移逻辑
观点 离子交换树脂系统的竞争核心,已经不再是“树脂材料”,而是“系统工程能力 供应链组织能力”。 2026年关税变量的加入,本质上正在把这个行业从“化工材料赛道”,推向“工程系统全球制造网络”的复合竞争阶段。一、这不是树脂…...
2026年AI Agent将迎来爆发!这五大趋势将重塑企业未来,你准备好了吗?
2026年AI Agent将进入规模化部署阶段,应用渗透率将大幅提升。文章分析了五大核心趋势:多智能体协同、企业级部署规模化、行业垂直化、可信性与透明度提升,以及人机协作模式重构。同时,文章也提醒企业需警惕项目失败风险࿰…...
灵毓秀-牧神-造相Z-Turbo使用全攻略:从环境检查到作品输出
灵毓秀-牧神-造相Z-Turbo使用全攻略:从环境检查到作品输出 1. 镜像简介与核心功能 灵毓秀-牧神-造相Z-Turbo是一款基于Xinference部署的AI文生图模型服务,专门用于生成《牧神记》中灵毓秀角色的高质量图像。该镜像集成了Gradio交互界面,让用…...
GLM-4.1V-9B-Base开发入门:PyCharm专业版连接远程解释器进行模型调试
GLM-4.1V-9B-Base开发入门:PyCharm专业版连接远程解释器进行模型调试 1. 为什么需要远程调试 在AI模型开发过程中,我们经常遇到一个典型问题:本地机器性能不足,无法高效运行大型语言模型。GLM-4.1V-9B-Base这类模型通常需要GPU加…...
河海大学材料科学与工程及材料与化工专业考研复试资料(含《材料分析方法》笔试专项)
温馨提示:文末有联系方式河海大学材料类考研复试资料全面升级 本套资料专为报考河海大学材料科学与工程、材料与化工两个硕士专业的考生设计,聚焦复试核心笔试科目——《材料分析方法》,助力精准高效备考。由2025届一志愿录取考生权威整理 所…...
5分钟搞懂格拉姆角场(GAF):用Python实现时间序列转图像的全流程
5分钟实战格拉姆角场(GAF):Python代码实现与工业级应用解析 时间序列分析一直是数据科学领域的核心挑战之一。传统方法往往难以捕捉复杂的时间依赖关系,而格拉姆角场(Gramian Angular Field, GAF)技术通过将…...
论文详解 | 基于轨迹数据的多层空间交互网络动态社区发现与时序分析
论文详解 | 基于轨迹数据的多层空间交互网络动态社区发现与时序分析 一、论文基础信息与核心概述 1.1 论文基础信息 项目 详情 论文标题 Dynamical community detection and spatiotemporal analysis in multilayer spatial interaction networks using trajectory data 1.2 …...
别再手动调时间了!手把手教你用LinuxPTP的ptp4l和phc2sys搞定TSN网络时钟同步
工业TSN网络高精度时钟同步实战:从原理到生产环境部署 在工业自动化、智能驾驶和实时音视频传输领域,微秒级的时间同步已成为刚需。传统NTP协议毫秒级的精度在这些场景下显得力不从心,而基于IEEE 1588和802.1AS协议的PTP(精确时间…...
