[C++] STL :stackqueue详解 及 模拟实现

标题:[C++] STL :stack&&queue详解

@水墨不写bug



目录

(一)stack简介

(二)queue简介

(三)容器适配器

(四)stack和queue的模拟实现


/***                    _ooOoo_*                   o8888888o*                   88" . "88*                   (| -_- |)*                    O\ = /O*                ____/`---'\____*              .   ' \\| |// `.*               / \\||| : |||// \*             / _||||| -:- |||||- \*               | | \\\ - /// | |*             | \_| ''\---/'' | |*              \ .-\__ `-` ___/-. /*           ___`. .' /--.--\ `. . __*        ."" '< `.___\_<|>_/___.' >'"".*       | | : `- \`.;`\ _ /`;.`/ - ` : | |*         \ \ `-. \_ __\ /__ _/ .-` / /* ======`-.____`-.___\_____/___.-`____.-'======*                    `=---='** .............................................*          佛祖保佑             永无BUG*/

正文开始:

(一)stack简介

        通过查询cplusplus我们可以发现stack与以往的容器不同,比如vector;

        比较上图,vector是一种容器;而栈是一种容器适配器。什么是容器适配器?在这里我们放在后文解释,我们首先了解一下什么是栈:

        1.STL的栈是一种容器适配器,栈是一种数据结构,数据遵循后进先出,并且只能从栈的一端进行数据的插入与提取。

        2.栈的功能实现比较简便,我们发现我们可以把vector或者是list当成是一个栈:能把vector或list当成一个栈,是可以把栈实现为容器适配器的原因。

        容器适配器就是将一种特殊的类作为底层容器,并提供一组特定的成员函数来访问元素。

        3.stack的成员函数比较少,功能简单:

函数说明接口说明
stack()构造空的栈
empty()检测stack是否为空
size()返回stack中元素的个数
top()返回栈顶元素的引用
push()将元素val压入stack中
pop()将stack中尾部的元素弹出


        这些成员函数的具体功能如果你有疑问,可以参考这一篇文章:《栈详解及C实现》


(二)queue简介

        1.队列也是一种容器适配器,队列是一种数据结构,数据遵循先进先出,数据从容器一端进入,从另一端提取。

        2.STL中,队列通过容器适配器方式实现,在这里,容器适配器就是通过封装一个特定的类,同时提供特定的接口成员函数来访问内部的元素数据。

        3.常见的队列的成员函数有:

函数声明接口说明
queue()构造空的队列
empty()检测队列是否为空,是返回true,否则返回false
size()返回队列中有效元素的个数
front()返回队头元素的引用
back()返回队尾元素的引用
push()在队尾将元素val入队列
pop()将队头元素出队列

(三)容器适配器

        通过上文对两个容器适配器的讲述,你或许已经对容器适配器有了一定的认识。但是容器适配器到底是什么?

        容器适配器是C++中一种特殊类型的容器,它通过封装现有的容器类实现不同的数据结构和功能。容器适配器通过提供不同的接口和封装现有容器的功能,使得程序员可以根据需求选择合适的数据结构。常见的容器适配器有栈(stack)、队列(queue)和优先队列(priority_queue)。

        我们在使用容器适配器的时候,可以选择底层的容器,但是在使用容器适配器的时候,不需要关心底层实现的容器到底是什么。

        比如:我们可以用vector容器或者list容器来实现stack的适配器,如果我们已经成功实现,在使用stack的时候,就不需要关心底层究竟是vector还是list了。

(四)stack和queue的模拟实现

        我们可以通过使用模板参数T,来使得容器内的数据类型更加灵活;通过设置一个参数Container来接受我们选择的容器。

模拟实现STL的stack源码:

#pragma once
#include<iostream>
#include<deque>using namespace std;
namespace ddsm
{template<class T,class Container = std::deque<T>> class stack{public:void push(const T& val){_con.push_back(val);}void pop(){_con.pop_back();}bool empty(){return _con.empty();}size_t size(){return _con.size();}T& top(){return _con.back();}private:Container _con;};
}

模拟实现queue:

#pragma once
#include<iostream>#include<deque>
using namespace std;
namespace ddsm
{template<class T,class Container = std::deque<T>>class queue{public:void push(const T& val){_con.push_back(val);}void pop(){_con.pop_front();}T& front(){return _con.front();}T& back(){return _con.back();}bool empty(){return _con.empty();}size_t size(){return _con.size();}private:Container _con;};
}

        在模拟实现中,我们发现模板参数Container给了一个缺省参数deque;deque是STl的一种容器,它具有比vector和list更加复杂的结构,这里我们放在下次分享。


完~

未经作者同意禁止转载 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/45829.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

liunx作业笔记1

一、选择题&#xff08;每小题2分&#xff0c;共20分&#xff09; 1、下列变量命名为Shell中无效变量名的是&#xff08; D &#xff09; A、v_ar1 B、var1 C、_var D、*var 变量名以字母开头&#xff0c;包含下划线和数字。 2、关于expr命令的使用下列命令中得数不等于…

论文创新点总结

TOC 双分支模型 今天读的这篇文章中提到了一种以前没有接触的模型&#xff0c;这个模型使用了双分支的网络来处理图像增强的问题&#xff08;将图像增强问题分解为亮度调整和色度恢复两个子问题&#xff09;&#xff0c;其中一个分支为亮度调整网络&#xff08;LAN&#xff0…

数据结构(初阶1.复杂度)

文章目录 一、复杂度概念 二、时间复杂度 2.1 大O的渐进表示法 2.2 时间复杂度计算示例 2.2.1. // 计算Func2的时间复杂度&#xff1f; 2.2.2.// 计算Func3的时间复杂度&#xff1f; 2.2.3.// 计算Func4的时间复杂度&#xff1f; 2.2.4.// 计算strchr的时间复杂度&#xff1f; …

构造者模式的实现

引言——构造复杂对象的艺术 软件工程中&#xff0c;构造复杂对象的艺术被巧妙地封装在构造者模式&#xff08;Builder Pattern&#xff09;中。这种设计模式不仅提供了一种清晰且灵活的方式来构建复杂对象&#xff0c;还使得代码更具可读性和可维护性。构造者模式的核心思想是…

Unity最新第三方开源插件《Stateful Component》管理中大型项目MonoBehaviour各种序列化字段 ,的高级解决方案

上文提到了UIState, ObjectRefactor等,还提到了远古的NGUI, KBEngine-UI等 这个算是比较新的解决方法吧,但是抽象出来,问题还是这些个问题 所以你就说做游戏是不是先要解决这些问题? 而不是高大上的UiImage,DoozyUI等 Mono管理引用基本用法 ① 添加Stateful Component …

python的变量与赋值

变量 定义&#xff1a;变量是内存中存储数据的标识符。命名规则&#xff1a;变量名可以包含字母、数字、下划线&#xff0c;但不能以数字开头。例如&#xff1a;name, _var, var2 都是合法的变量名&#xff0c;但 2var 是不合法的。 赋值 操作符&#xff1a;使用 符号进行赋…

安全测试理论

安全测试理论 什么是安全测试&#xff1f; 安全测试&#xff1a;发现系统安全隐患的过程安全测试与传统测试区别 传统测试&#xff1a;发现bug为目的 安全测试&#xff1a;发现系统安全隐患什么是渗透测试 渗透测试&#xff1a;已成功入侵系统为目标的的攻击过程渗透测试与安全…

ES6 Generator函数的异步应用 (八)

ES6 Generator 函数的异步应用主要通过与 Promise 配合使用来实现。这种模式被称为 “thunk” 模式&#xff0c;它允许你编写看起来是同步的异步代码。 特性&#xff1a; 暂停执行&#xff1a;当 Generator 函数遇到 yield 表达式时&#xff0c;它会暂停执行&#xff0c;等待 …

“好物”推荐+Xshell连接实例+使用Conda创建独立的Python环境

目录 主题&#xff1a;好易智算平台推荐RTX 4090DGPU实例租用演示安装配置torch1.9.1cuda11.1.1环境引言&#xff1a;算力的新时代平台介绍&#xff1a;技术与信任的结晶使用案例&#xff1a;实际使用展示创建实例开始使用连接实例&#xff08;下文演示使用Xshell连接&#xff…

Android Studio下载与安装

Android Studio下载与安装_android studio下载安装-CSDN博客

昇思25天学习打卡营第二十天|基于MobileNetv2的垃圾分类

打卡营第二十天&#xff0c;今天学习的内容是MobileNet垃圾分类&#xff0c;记录一下学习内容&#xff1a; 学习内容 本文档主要介绍垃圾分类代码开发的方法。通过读取本地图像数据作为输入&#xff0c;对图像中的垃圾物体进行检测&#xff0c;并且将检测结果图片保存到文件中…

Jupyter Notebook 使用教程

Jupyter Notebook 使用教程 目录 概述启动Jupyter Notebook创建新的NotebookNotebook界面介绍使用代码单元格使用Markdown单元格Notebook的基本操作保存和导出Notebook扩展功能和技巧 1. 概述 Jupyter Notebook是一个开源的Web应用程序&#xff0c;允许您创建和共享包含代码…

VMM、VMI、VIM的简介

VMM 指的是虚拟机监控器&#xff08;Virtual Machine Monitor&#xff09;&#xff0c;也被称为虚拟化管理程序&#xff08;Hypervisor&#xff09;。VMM 是一种软件、固件或硬件的组合&#xff0c;它在物理硬件和虚拟机之间充当中介。其主要功能是创建、管理和运行虚拟机&…

【ARM】CCI集成指导整理

目录 1.CCI集成流程 2.CCI功能集成指导 2.1CCI结构框图解释 Request concentrator Transaction tracker Read-data Network Write-data Network B-response Network 2.2 接口注意项 记录一下CCI500的ACE slave interface不支持的功能&#xff1a; 对于ACE-Lite slav…

基于信号处理的PPG信号滤波降噪方法(MATLAB)

光电容积脉搏波PPG信号结合相关算法可以用于人体生理参数检测&#xff0c;如血压、血氧饱和度等&#xff0c;但采集过程中极易受到噪声干扰&#xff0c;对于血压、血氧饱和度测量的准确性造成影响。随着当今社会医疗保健技术的发展&#xff0c;可穿戴监测设备对于PPG信号的质量…

简单的SQL字符型注入

目录 注入类型 判断字段数 确定回显点 查找数据库名 查找数据库表名 查询字段名 获取想要的数据 以sqli-labs靶场上的简单SQL注入为例 注入类型 判断是数字类型还是字符类型 常见的闭合方式 ?id1、?id1"、?id1)、?id1")等&#xff0c;大多都是单引号…

【ASTGCN】模型调试学习笔记--数据生成详解(超详细)

利用滑动窗口生成时间序列 原理图示&#xff1a; 以PEMS04数据集为例。 该数据集维度为&#xff1a;(16992,307,3)&#xff0c;16992表示时间序列的长度&#xff0c;307为探测器个数&#xff0c;即图的顶点个数&#xff0c;3为特征数&#xff0c;即流量&#xff0c;速度、平…

期权专题12:期权保证金和期权盈亏

目录 1. 期权保证金 1.1 计算逻辑 1.2 代码复现 1.3 实际案例 2. 期权盈亏 2.1 价格走势 2.2 计算公式 2.2.1 卖出期权 2.2.2 买入期权 免责声明&#xff1a;本文由作者参考相关资料&#xff0c;并结合自身实践和思考独立完成&#xff0c;对全文内容的准确性、完整性或…

[CISCN 2023 华北]normal_snake

[CISCN 2023 华北]normal_snake 源码和依赖 算了直接说吧&#xff0c;不想截图了&#xff0c;就多了一个C3P0和yaml的依赖 然后read路由可以反序列化yaml的Str 我们看到waf 那个String是可以二次反序列化绕过的,然后CUSTOM_STRING1解码后是"BadAttributeValuePairExcept…

【java】力扣 反转链表

力扣 206 链表反转 题目介绍 解法讲解 先定义两个游标indexnull&#xff0c;prenull&#xff0c;反转之后链表应该是5&#xff0c;4&#xff0c;3&#xff0c;2&#xff0c;1&#xff0c;我们先进行2->1的反转&#xff0c;然后再循坏即可 让定义的游标index去存储head.n…