深入探究C++ 中的stack、queue和deque
目录
一、stack(栈)
二、queue(队列)
三、deque(双向队列)
四、容器适配器总结
在C++ 的标准模板库(STL)中,stack、queue和priority_queue是非常实用的容器适配器,它们为我们处理数据提供了极大的便利。今天,就让我们深入了解一下它们的原理、使用方法以及相关代码实现。
一、stack(栈)
1. 原理介绍
栈是一种遵循后进先出(LIFO)原则的容器适配器。它的删除操作只能从容器的一端进行,即只能在栈顶插入和提取元素。在STL中,stack默认使用deque作为其底层容器,当然也可以指定vector或list等其他符合要求的容器。
2. 使用方法
- 构造函数: stack<T> s 可以创建一个空栈, T 为栈中元素的类型。
- 判空操作: s.empty() 用于检测栈是否为空,如果为空返回 true ,否则返回 false 。
- 获取元素个数: s.size() 返回栈中元素的个数。
- 获取栈顶元素: s.top() 返回栈顶元素的引用。
- 压栈操作: s.push(x) 将元素 x 压入栈中。
- 弹栈操作: s.pop() 将栈顶元素弹出。
3. 代码示例
cpp#include <iostream>#include <stack>using namespace std;int main() {stack<int> s;s.push(1);s.push(2);s.push(3);while (!s.empty()) {cout << s.top() << " ";s.pop();}return 0;}
1. 模拟实现
cpp#include <vector>namespace bite {template<class T>class stack {public:stack() {}void push(const T& x) { _c.push_back(x); }void pop() { _c.pop_back(); }T& top() { return _c.back(); }const T& top() const { return _c.back(); }size_t size() const { return _c.size(); }bool empty() const { return _c.empty(); }private:std::vector<T> _c;};}
二、queue(队列)
1. 原理介绍
队列是一种遵循先进先出(FIFO)原则的容器适配器。元素从队尾入队列,从队头出队列。在STL中,queue默认使用deque作为底层容器,也可指定list等符合条件的容器。
2. 使用方法
- 构造函数: queue<T> q 创建一个空队列, T 为队列中元素的类型。
- 判空操作: q.empty() 检测队列是否为空,为空返回 true ,否则返回 false 。
- 获取元素个数: q.size() 返回队列中有效元素的个数。
- 获取队头元素: q.front() 返回队头元素的引用。
- 获取队尾元素: q.back() 返回队尾元素的引用。
- 入队操作: q.push(x) 在队尾将元素 x 入队列。
- 出队操作: q.pop() 将队头元素出队列。
3. 代码示例
cpp#include <iostream>#include <queue>using namespace std;int main() {queue<int> q;q.push(1);q.push(2);q.push(3);while (!q.empty()) {cout << q.front() << " ";q.pop();}return 0;}
1. 模拟实现
cpp#include <list>namespace bite {template<class T>class queue {public:queue() {}void push(const T& x) { _c.push_back(x); }void pop() { _c.pop_front(); }T& back() { return _c.back(); }const T& back() const { return _c.back(); }T& front() { return _c.front(); }const T& front() const { return _c.front(); }size_t size() const { return _c.size(); }bool empty() const { return _c.empty(); }private:std::list<T> _c;};}
三、deque(双向队列)
1. 原理介绍
deque (双端队列)是一种数据结构,通常用连续内存空间存储元素,通过维护头部和尾部指针来实现双端操作。插入和删除元素在两端都能高效进行,时间复杂度通常为O(1),常用于缓存、广度优先搜索等场景。
2. 使用方法
std::deque<int> d; ;在前端插入
d.push_front(1) ,后端插入
d.push_back(2) ;前端删除
d.pop_front() ,后端删除
d.pop_back() ,访问元素 d[0] 获取首个元素。
3. 代码示例
#include <iostream>
#include <deque>
using namespace std;int main() {// 创建一个空的双端队列deque<int> d;// 在队列后端添加元素d.push_back(1);d.push_back(2);// 在队列前端添加元素d.push_front(3);d.push_front(4);// 输出双端队列的元素cout << "双端队列:";for (int num : d) {cout << num << " ";}cout << endl;// 从后端弹出元素int back_pop = d.back();d.pop_back();cout << "从后端弹出的元素:" << back_pop << endl;// 从前端弹出元素int front_pop = d.front();d.pop_front();cout << "从前端弹出的元素:" << front_pop << endl;// 输出操作后的双端队列的元素cout << "操作后的双端队列:";for (int num : d) {cout << num << " ";}cout << endl;return 0;
}
1. 注意事项
- 默认情况下, deque是大堆。
C++中 deque 的注意事项及示例:
1. 迭代器失效:在 deque 中插入或删除元素后,除了指向被删除元素的迭代器外,其他迭代器可能仍然有效,但可能会导致迭代器重新定位。
cpp#include <iostream>
#include <deque>
using namespace std;int main() {deque<int> d = {1, 2, 3, 4, 5};auto it = d.begin();d.insert(it, 0); // 插入元素后,迭代器it仍然有效for (int num : d) {cout << num << " ";}cout << endl;return 0;
}
1. 容量和内存管理: deque 的内存管理相对复杂,它通过分段连续内存实现。与 vector 相比, deque 在头部插入和删除元素更高效,因为不需要移动大量元素来调整内存。
cpp#include <iostream>
#include <deque>
using namespace std;int main() {deque<int> d;for (int i = 0; i < 10; ++i) {d.push_front(i); // 在头部高效插入元素}for (int num : d) {cout << num << " ";}cout << endl;return 0;
}
1. 边界检查:访问 deque 元素时,要确保索引在有效范围内,否则会导致未定义行为。使用 at() 成员函数会进行边界检查并在越界时抛出异常,而使用 [] 操作符不会进行检查。
cpp#include <iostream>
#include <deque>
using namespace std;int main() {deque<int> d = {10, 20, 30};// 使用[]操作符,不进行边界检查cout << d[2] << endl;// 使用at()进行边界检查,越界会抛出异常// cout << d.at(10) << endl; // 取消注释会抛出异常return 0;
}
四、容器适配器总结
stack、queue和deque作为容器适配器,为我们在不同场景下处理数据提供了便捷的方式。stack适用于需要后进先出逻辑的场景,比如函数调用栈;queue适用于先进先出的场景,像任务队列;deque (双端队列)在多种场景下为数据处理提供了便捷方式,
通过深入了解它们的原理和使用方法,并结合实际代码示例,我们能更好地在C++ 编程中运用这些强大的工具,提升代码的效率和可读性。希望这篇博客能对你理解和使用这些容器适配器有所帮助。
相关文章:
深入探究C++ 中的stack、queue和deque
目录 一、stack(栈) 二、queue(队列) 三、deque(双向队列) 四、容器适配器总结 在C 的标准模板库(STL)中,stack、queue和priority_queue是非常实用的容器适配器&…...
第十二节:性能优化高频题-shallowRef/shallowReactive使用场景
适用场景:大型对象/列表仅需第一层响应式变化(如JSON配置数据) Vue3 浅层响应式 API(shallowRef/shallowReactive)使用场景深度解析 一、核心使用场景与性能优化原理 大型 JSON 配置数据管理 • 场景特征:…...
openGauss DB4AI与scikit-learn模块对比探究
openGauss当前版本支持了原生DB4AI能力,引入原生AI算子,简化操作流程,充分利用数据库优化器、执行器的优化与执行能力,获得高性能的数据库内模型训练能力。 本文介绍了笔者采用鸢尾花数据集,对openGauss DB4AI功能进行…...
基于大模型的公安预审办案笔录分析的挑战与应对策略-3
引言 :在基于大模型的公安预审办案笔录分析应用过程中,虽然取得了一定的成果,但也面临着诸多挑战。本文将分析这些挑战,并提出相应的应对策略,以推动该技术在公安领域的更好地发展和应用。 引文:https://c…...
ubantu18.04(Hadoop3.1.3)之Flink安装与编程实践(Flink1.9.1)
说明:本文图片较多,耐心等待加载。(建议用电脑) 注意所有打开的文件都要记得保存。 第一步:准备工作 本文是在之前Hadoop搭建完集群环境后继续进行的,因此需要读者完成我之前教程的所有操作。 注意本次实…...
AI辅助编程-cursor开发煤矿持证上岗管理程序需求与设计篇
Cursor 是一款由人工智能驱动的智能代码编辑器,深度融合AI技术以提升开发效率。其核心功能基于GPT-4等先进模型,支持代码生成、错误修复、智能补全及自然语言编程。开发者可通过对话交互直接描述需求,AI即时生成对应代码片段,显…...
如何使用极狐GitLab 议题看板?
极狐GitLab 是 GitLab 在中国的发行版,关于中文参考文档和资料有: 极狐GitLab 中文文档极狐GitLab 中文论坛极狐GitLab 官网 议题看板 (BASIC ALL) 议题看板是一个软件项目管理工具,用于计划、组织和可视化功能或产品发布的工作流程。它可…...
计网分层体系结构(包括OSI,IP,两者对比和相关概念)
1. 应用层: 用户与网络的界面,FTP,SMTP, HTTP 2. 表示层(Presentation Layer): 解决用户信息的语法表示问题 数据压缩,加密解密 表示变换 3. 对话层(Session Layer): 功能:允许不同主机的各个进…...
爬虫过程中如何确保数据准确性
在爬虫过程中,确保数据的准确性是非常重要的。数据不准确可能会导致分析结果的偏差,甚至影响决策。以下是一些确保爬虫数据准确性的方法和技巧: 一、验证数据来源 确保数据来源的可靠性是确保数据准确性的第一步。选择信誉良好的网站作为数…...
Maven多模块工程版本管理:flatten-maven-plugin扁平化POM
🧑 博主简介:CSDN博客专家,历代文学网(PC端可以访问:https://literature.sinhy.com/#/?__c1000,移动端可微信小程序搜索“历代文学”)总架构师,15年工作经验,精通Java编…...
数据库基础与核心操作:从概念到实战的全面解析
目录 1 基本概念2 基本操作2.1 DCL2.2 DDL2.3 DML2.4 DQL(高级查询) 3 高级功能3.1 视图(无参函数)3.2 存储过程(有参函数)3.3 触发器 4 约束4.1 主键约束4.2 UNIQUE KEY(唯一键约束)4.3 FOREIGN KEY(外键约束…...
网络原理 - 10(HTTP/HTTPS - 1)
前面的网络原理 1 - 9,按照 TCP/IP 五层协议栈,介绍了各个层次的核心协议。 应用层:自定义协议(xml,json....) 传输层:UDP/TCP 网络层:IP 数据链路层:以太网 我们这…...
UDP协议详解+代码演示
1、UDP协议基础 1. UDP是什么? UDP(User Datagram Protocol,用户数据报协议)是传输层的核心协议之一,与TCP并列。它的主要特点是: 无连接:通信前不需要建立连接(知道对端的…...
QT事件Trick
拖动 void DWidget::mousePressEvent(QMouseEvent *event) {if(event->button()Qt::LeftButton){QListWidgetItem *selItem currentItem();if(selItem! nullptr){m_startPosevent->pos(); //记录鼠标按下时的起始位置}}QListWidget::mousePressEvent(event); }void DW…...
解答UnityShader学习过程中的一些疑惑(持续更新中)
一、坐标系相关 shader中会有几种空间: 模型空间:以物体自己为中心原点 世界空间:就是unity的世界坐标 观察空间(视图空间):以相机为中心的坐标系 裁剪空间:是一个4d空间,有x,y,z,w…...
【图论 拓扑排序 bfs】P6037 Ryoku 的探索|普及+
本文涉及知识点 C图论 CBFS算法 P6037 Ryoku 的探索 题目背景 Ryoku 对自己所处的世界充满了好奇,她希望能够在她「死」之前尽可能能多地探索世界。 这一天,Ryoku 得到了一张这个世界的地图,她十分高兴。然而,Ryoku 并不知道…...
Spring Boot定时任务
在 Spring Boot 中实现定时任务主要依赖于Scheduled注解和 Spring 调度器。 基本概念 定时任务,简单来说就是在特定的时间点或按照一定的时间间隔自动执行的任务。在 Spring Boot 中,实现定时任务主要依赖于 Spring 框架提供的 Scheduled 注解和 TaskSc…...
如何使用electron-forge开发上位机ui
Electron Forge是一个用于快速构建、打包和发布Electron应用程序的工具。它提供了一种简单的方式来设置Electron项目,并使用现代工具和最佳实践来管理应用程序的开发和部署过程。使用Electron Forge,开发人员可以轻松地创建跨平台的桌面应用程序…...
idea启动springboot方式及web调用
使用以下方式启动springboot. 我这里是微服务, 本地调试需要启动程序使用 1. 通过maven检测到Profile配置 2. web调用 我这里直接用 apifox接口调用, 带着token和一些必要参数。有这几点: 请求头要加的token需要是网页上F12获取到的 如果是微服务本地调用。url需要…...
利用EMQX实现单片机和PyQt的数据MQTT互联
https://www.dong-blog.fun/post/2050 基于MQTT的设备监控与控制系统设计 引言 物联网(IoT)设备的远程监控与控制是现代智能系统的基础需求。本文将介绍一个基于MQTT协议的设备监控与控制系统,该系统由两部分组成:模拟单片机设备和PyQt客户端。我们将…...
C#/.NET/.NET Core技术前沿周刊 | 第 36 期(2025年4.21-4.27)
前言 C#/.NET/.NET Core技术前沿周刊,你的每周技术指南针!记录、追踪C#/.NET/.NET Core领域、生态的每周最新、最实用、最有价值的技术文章、社区动态、优质项目和学习资源等。让你时刻站在技术前沿,助力技术成长与视野拓宽。 欢迎投稿、推荐…...
Context7 MCP:提供实时、版本特定的文档以解决AI幻觉问题
在实际开发中,使用AI辅助编码常常出现令人沮丧的问题:AI提供的API调用建议往往已经过时,或者根本不存在。 特别是当您使用最新版库时,这个问题尤为明显。 Upstash团队开发的Context7开源工具正是为解决这一痛点而生。 版本不匹配导致的API错误 现代开发库迭代速度快,常…...
电路研究9.3.2——合宙Air780EP中的AT开发指南:HTTP(S)-PDP的研究
按照推荐的GPRS模块的学习顺序,现在需要研究的是HTTP(S)了,所以我们就继续学习吧。 9.5.2 HTTP(S)应用指南 应用概述 4G 模块支持 HTTP 和 HTTPS 协议(这个确实也考虑过了,但是不知道合不合适呢,而且我们计划的通讯是只…...
K8S ConfigMap 快速开始
一、什么是 ConfigMap? ConfigMap 是 Kubernetes 中用于存储非敏感配置数据的 API 对象,支持以键值对(Key-Value)或文件的形式存储配置,允许将配置与镜像解耦,实现配置的集中管理和动态更新。 二、主要用…...
【星海出品】K8S调度器leader
发现K8S的技术资料越写越多,独立阐述一下K8S-Scheduler-leader 调度器通过Watch机制来发现集群中【新创建】且尚未被调度【unscheduled】到节点上的pod。 由于 Pod 中的容器和 Pod 本身可能有不同的要求,调度程序会过滤掉任何不满足 Pod 特定调度需求的…...
第十二届蓝桥杯 2021 C/C++组 空间
目录 题目: 题目描述: 题目链接: 思路: 思路详解: 代码: 代码详解: 题目: 题目描述: 题目链接: 空间 - 蓝桥云课 思路: 思路详解&#…...
通过深度学习推进增材制造:当前进展与未来挑战综述
通过深度学习推进增材制造:当前进展与未来挑战综述 原文信息: 标题:Advancing Additive Manufacturing through Deep Learning: A Comprehensive Review of Current Progress and Future Challenges 作者:Amirul Islam Saimon, Emmanuel Yangue, Xiaowei Yue, Zhenyu (…...
深入蜂窝物联网 第三章 LTE-M(Cat-M1)详解:省电机制与移动特性
1. 前言与应用场景 在蜂窝物联网阵营中,LTE-M(Cat-M1) 兼具低功耗和中速率,且支持移动场景下的无缝切换,因而成为物流追踪、可穿戴设备、智能路灯、共享单车等场景的首选。 本章将系统剖析: 核心特性:PSM、eDRX 与移动性保障; 协议流程:简化的 RRC/NAS 步骤; 时序图…...
软件设计师速通其一:计算机内部数据表示
考试资料推荐 ,这也是大部分图片的出处。本文章主要将视频原本讲的不详细、不便于理解的东西摆开揉碎了给到读者。相信本文能帮您更好更快的学习知识。本文也是您考前快速复习的不二之选。本文会用星星来表示每个考点的重要性,其中一颗★表示课外拓展&am…...
Kubernetes》》k8s》》Taint 污点、Toleration容忍度
污点 》》 节点上 容忍度 》》 Pod上 在K8S中,如果Pod能容忍某个节点上的污点,那么Pod就可以调度到该节点。如果不能容忍,那就无法调度到该节点。 污点和容忍度的概念 》》污点等级——>node 》》容忍度 —>pod Equal——>一种是等…...
【爬虫】一文掌握 adb 的各种指令(adb备忘清单)
更多内容请见: 爬虫和逆向教程-专栏介绍和目录 文章目录 入门设备基础Logcat文件管理远程 Shell包安装Paths手机信息包信息设备相关命令权限Logs常见的 ADB 命令将文件推送到 Android 设备的下载文件夹列出所有已安装的包并获取完整路径从安卓设备中提取文件从主机安装 APK 到…...
1.7无穷级数
引言 无穷级数是考研数学一的核心内容,涵盖数项级数、幂级数、傅里叶级数等核心概念。本文系统梳理4大考点,结合公式速查与实战示例,助你高效突破级数难点! 考点一:数项级数敛散性判定 1️⃣ 正项级数 (1) 比较审敛…...
vitest | 测试框架vitest | 总结笔记
测试框架 vitest 介绍 网址:Vitest | Next Generation testing framework 特点:①支持vite的生态系统,②兼容jest语法 ③HMR测试(速度快) ④ ESM(js的原生支持) 安装 Vitest: npm …...
使用 ELK 实现全链路追踪:从零到一的实践指南
前言 在现代分布式系统中,随着服务数量的增加,系统的复杂性也呈指数级增长。为了快速定位问题、分析性能瓶颈,全链路追踪成为一项必不可少的能力。本文将详细介绍如何利用 ELK(Elasticsearch Logstash Kibana) 实现…...
AI智能体开发实战:从概念到落地的全流程解析
一、AI智能体:重新定义人机协作 什么是AI智能体? AI智能体是具备感知-思考-行动闭环能力的程序实体,能够通过传感器(如文本输入、图像识别)获取信息,基于大模型推理决策,并通过API、机器人等执…...
如何搭建spark yarn 模式的集群
搭建Spark on YARN集群的步骤 Spark on YARN模式允许Spark作业在Hadoop YARN资源管理器上运行,这样可以更好地与Hadoop生态系统集成并共享集群资源。以下是搭建Spark YARN集群的详细步骤: 前提条件 已安装并配置好Hadoop集群(包括HDFS和YAR…...
DDoS 攻击如何防护?2025最新防御方案与实战指南
一、DDoS 攻击的致命威胁:你的业务离瘫痪有多近? 1. 2024 年 DDoS 攻击现状 攻击规模:全球日均攻击峰值突破7.2Tbps,混合型攻击占比超 65%(来源:Cloudflare)行业重灾区: 行业攻击占…...
3D架构图软件 iCraft Editor 正式发布 @icraft/player-react 前端组件, 轻松嵌入3D架构图到您的项目
安装 pnpm install icraft/player-react --saveimport { ICraftPlayer } from "icraft/player-react";export default function MyScene() {return <ICraftPlayer srcyour-scene.iplayer />; }icraft/player-react 为开发者提供了一站式的3D数字孪生可视化解决…...
esm使用-包括esmfold和embedding
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言零、安装一、esmfold的使用二、esm2的embedding1.模型加载与准备2.读入数据3.提取残基级表示4.生成序列级表示(均值池化)5.可视化自注意力接触图6.潜在问题与改进建议7.小结总结前言 主要参…...
【Nginx】 使用least_conn负载均衡算法是否能将客户端的长连接分散到不同的服务器上demo
为了验证Nginx在关闭HTTP Keepalive的情况下,使用least_conn负载均衡算法是否能将客户端的长连接分散到不同的服务器上,我们可以搭建一个简单的环境。这个环境包括: 一个Nginx服务器作为负载均衡器。两个后端服务器(可以使用简单…...
TMI投稿指南(三):共同作者
IEEE 作者编辑风格手册 --- IEEE Editorial Style Manual for Authors 投稿之后检查路径: IEEE 作者门户:登录 --- IEEE Author Gateway: Login 共同第一作者:在许多领域,被视为成为第一作者是件好事。但只有一个人可以是第一作…...
Java多线程入门案例详解:继承Thread类实现线程
本文通过一个简单案例,讲解如何通过继承 Thread 类来实现多线程程序,并详细分析了代码结构与运行机制。 一、前言 在 Java 中,实现多线程主要有两种方式: 继承 Thread 类 实现 Runnable 接口 本文以继承 Thread 类为例&#x…...
Transformer Prefill阶段并行计算:本质、流程与思考
Transformer Prefill阶段并行计算:本质、流程与思考 “为什么Transformer在Prefill阶段可以并行?并行到什么程度?哪里还需要同步?今天讲清楚!” 引子 在大语言模型(LLMs)爆发的时代,…...
KUKA机器人自动备份设置
在机器人的使用过程中,对机器人做备份不仅能方便查看机器人的项目配置与程序,还能防止机器人项目和程序丢失时进行及时的还原,因此对机器人做备份是很有必要的。 对于KUKA机器人来说,做备份可以通过U盘来操作。也可以在示教器上设…...
Lua 第13部分 位和字节
13.1 位运算 Lua 语言从 5.3 版本开始提供了针对数值类型的一组标准位运算符。与算术运算符不同的是,位运算符只能用于整型数。位运算符包括 &( 按位与)、|(按位或)、~(按…...
下载同时返回其他参数
一般情况下下载的接口是没有返回值的,直接返回一个文件 浏览器直接触发文件下载 但是有一些奇葩需求,除了文件外还需要一些其他字段返回。这个时候就只能把文件转成字符串返回,然后再由前端做下载或者展示 后台获取字符 byte[] byte[] bo…...
240428 leetcode exercises
240428 leetcode exercises jarringslee 文章目录 240428 leetcode exercises[25. K 个一组翻转链表 ](https://leetcode.cn/problems/reverse-nodes-in-k-group/solutions/3663828/xian-fan-zhuan-lian-biao-zai-kyi-ge-zu-f-lgaj/)🔁 探宗求源 其义自见 [75. 颜色…...
SQLMesh 审计与测试:确保数据质量的利器
在数据科学项目中,确保数据质量和准确性至关重要。SQLMesh 提供了审计和测试两种工具来验证数据。本文将介绍 SQLMesh 的审计功能,并与测试进行对比,帮助您更好地理解如何在项目中使用这些工具。 SQLMesh 审计 SQLMesh 的审计功能可以帮助您…...
SQL Server 存储过程开发规范
SQL Server 存储过程开发规范(高级版) 1. 总则 1.1 目标 本规范旨在: 提高存储过程的事务一致性、异常可追踪性、错误透明度。 统一日志记录、错误码管理、链路追踪(Trace ID)。 支持复杂事务场景(嵌套…...
图像处理篇---信号与系统的应用
文章目录 前言一、信号表示层面图像作为二维信号二、系统特性分析线性移变系统建模采样系统理论应用时域采样定理在帧率选择中的应用三、变换域处理多维傅里叶分析小波变换与多分辨率分析四、系统响应特性人类视觉系统(HVS)建模摄像机系统响应五、编码系统中的信号处理预测编…...