[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.rhkb.cn/news/376057.html

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

相关文章

LabVIEW从测试曲线中提取特征值

在LabVIEW中开发用于从测试曲线中提取特征值的功能时&#xff0c;可以考虑以下几点&#xff1a; 数据采集与处理&#xff1a; 确保你能够有效地采集和处理测试曲线数据。这可能涉及使用DAQ模块或其他数据采集设备来获取曲线数据&#xff0c;并在LabVIEW中进行处理和分析。 特…

lvs集群、NAT模式和DR模式、keepalive

目录 lvs集群概念 集群的类型&#xff1a;三种类型 系统可靠性指标 lvs集群中的术语 lvs的工作方式 NAT模式 lvs的工具 算法 实验 数据流向 步骤 一 、调度器配置&#xff08;test1 192.168.233.10&#xff09; 二、RS配置&#xff08;nginx1和nginx2&#xff09;…

Python那些优质可视化工具!

作者&#xff1a;Lty美丽人生 https://blog.csdn.net/weixin_44208569 本次分享10个适用于多个学科的Python数据可视化库&#xff0c;其中有名气很大的也有鲜为人知的&#xff01; 1、matplotlib 两个直方图 matplotlib 是Python可视化程序库的泰斗。经过十几年它任然是Pytho…

王牌站士Ⅴ--mysql9.0发布向量类型糊弄了事

前言 MySQL在本月发布了9.0大版本&#xff0c;作为一个老用户&#xff0c;忍不住关注了一下&#xff0c;简单说下这次大版本更新。 2023年&#xff0c;AI爆火&#xff0c;带动了向量数据库赛道。当下几乎所有主流 DBMS 都已经提供向量数据类型支持 —— MySQL 除外。 大家原…

【vue教程】二. Vue特性原理详解

目录 回顾本章涵盖知识点Vue 实例和选项创建 Vue 实例Vue 实例的选项 Vue 模板语法插值表达式指令v-bindv-modelv-on 自定义指令创建自定义指令在模板中使用自定义指令自定义指令的钩子函数自定义指令的实例演示 指令注册局部注册指令过滤器 数据绑定和响应式原理响应式数据绑定…

【CUDA|CUDNN】安装

every blog every motto: You can do more than you think. https://blog.csdn.net/weixin_39190382?typeblog 0. 前言 显卡驱动安装参考之前的文章 cuda、cudnn 安装 1. cuda 安装 访问https://developer.nvidia.com/cuda-toolkit-archive 选择需要的版本&#xff1a;h…

css实现渐进中嵌套渐进的方法

这是我们想要的实现效果&#xff1a; 思路&#xff1a; 1.有一个底色的背景渐变 2.需要几个小的块级元素做绝对定位通过渐变filter模糊来实现 注意&#xff1a;这里的采用的定位方法&#xff0c;所以在内部的元素一律要使用绝对定位&#xff0c;否则会出现层级的问题&…

面试经验之谈

优质博文&#xff1a;IT-BLOG-CN ​通常面试官会把每一轮面试分为三个环节&#xff1a;① 行为面试 ② 技术面试 ③ 应聘者提问 行为面试环节 面试开始的5~10分钟通常是行为面试的时间&#xff0c;面试官会参照简历和你的自我介绍了解应聘者的过往经验和项目经历。由于面试官…

Hangfire发布托管到iis无法正常执行任务

本文以windowsServer2012R2iis8示例。 当我们设置了一个后台周期性任务后发布到iis&#xff0c;如果出现网站间隔时间较长没有用户去访问&#xff0c;这是iis可能就会自动回收导致Hangfire服务停止&#xff0c;导致我们的后台任务终止执行&#xff0c;直到进来一个请求&#xf…

基于全国产复旦微JFM7K325T+ARM人工智能数据处理平台

复旦微可以配合的ARM平台有&#xff1a;RK3588/TI AM62X/ NXP IMX.8P/飞腾FT2000等。 产品概述 基于PCIE总线架构的高性能数据预处理FMC载板&#xff0c;板卡采用复旦微的JFM7K325T FPGA作为实时处理器&#xff0c;实现各个接口之间的互联。该板卡可以实现100%国产化。 板卡具…

window下tqdm进度条

原代码是linux下运行&#xff0c;修改后可在window下运行。 #ifndef TQDM_H #define TQDM_H#include <chrono> #include <ctime> #include <numeric> #include <ios> #include <string> #include <cstdlib> #include <iostream> #i…

系统吃swap问题排查

目录 背景 问题 分析并解决 1.控制线程数 2.更换IO组件 3.Linux进程信息文件分析 总结加餐 参考文档 背景 隔壁业务组系统是简单的主从结构&#xff0c;写索引的服务(主)叫primary&#xff0c; 读索引并提供搜索功能的服务(从)叫replica。业务线同步数据并不是平滑的&…

【新书速递】使用MATLAB进行雷达系统分析和设计(第四版)(2022)

来源&#xff1a;公众号高山防务 一、目录 目录 1雷达定义和术语 1.1雷达系统分类和波段 1.1.1高频&#xff08;HF&#xff09;和甚高频&#xff08;VHF&#xff09;雷达&#xff08;A和B波段&#xff09; 1.1.2超高频&#xff08;UHF&#xff09;雷达&#xff08;C波段&am…

【学习css1】flex布局-页面footer部分保持在网页底部

中间内容高度不够屏幕高度撑不开的页面时候&#xff0c;页面footer部分都能保持在网页页脚&#xff08;最底部&#xff09;的方法 1、首先上图看显示效果 2、奉上源码 2.1、html部分 <body><header>头部</header><main>主区域</main><foot…

循环结构(一)——for语句【互三互三】

文章目录 &#x1f341; 引言 &#x1f341; 一、语句格式 &#x1f341; 二、语句执行过程 &#x1f341; 三、语句格式举例 &#x1f341;四、例题 &#x1f449;【例1】 &#x1f680;示例代码: &#x1f449;【例2】 【方法1】 &#x1f680;示例代码: 【方法2】…

通过git将文件push到github 远程仓库

1.先git clone 代码地址 git clone htttp://github.com/用户名/test.git 2. 添加文件 例如&#xff1a;touch 1.txt 3.将文件添加到暂存区 git add 1.txt 4.提交 git commit -m "commit 1.txt" 5.与远程仓库建立关联 git remote add 远程仓库名 远程仓库…

华为浏览器,Chrome的平替,插件无缝连接

文章目录 背景插件书签 背景 不知道各位小伙伴有没有这样的痛点&#xff0c;办公电脑、家里的电脑还有手机、平板等&#xff0c;收藏了一个网址或者在手机上浏览了某个网页&#xff0c;保存起来&#xff0c;可是一换平台或者换个电脑&#xff0c;在想要浏览之前收藏的东西&…

Elasticsearch 8 支持别名查询

在 Elasticsearch 8 中&#xff0c;使用 Java 高级 REST 客户端进行别名管理的过程与之前的版本类似&#xff0c;但有一些API细节上的变化。以下是如何使用 Java 和 Elasticsearch 8 进行别名操作的例子&#xff1a; 引入依赖 确保你的项目中包含了 Elasticsearch 的高级 RES…

iPad锁屏密码忘记怎么办?有什么方法可以解锁?

当我们在日常使用iPad时&#xff0c;偶尔可能会遇到忘记锁屏密码的尴尬情况。这时&#xff0c;不必过于担心&#xff0c;因为有多种方法可以帮助您解锁iPad。接下来&#xff0c;小编将为您详细介绍这些解决方案。 一、使用iCloud的“查找我的iPhone”功能 如果你曾经启用了“查…

亚马逊IP关联是什么?要怎么解决呢?

亚马逊不仅提供了广泛的商品和服务&#xff0c;也是许多企业和个人选择的电子商务平台。然而&#xff0c;与亚马逊相关的IP关联问题&#xff0c;特别是在网络安全和运营管理方面&#xff0c;经常成为使用亚马逊服务的用户和商家关注的焦点。通过了解亚马逊IP关联的含义、可能的…