STL之stack和queue

news2025/2/12 11:12:21

目录

  • stack和queue模拟实现
    • 一.介绍
      • 1.stack的类模板
      • 2.queue的类模板
      • 3.容器适配器
    • 二. deque类
      • 1. 简介
      • 2.常用成员函数
    • 三. stack模拟实现
      • 1.成员函数
      • 2.代码
    • 四.queue的模拟实现
      • 1.成员函数
      • 2.代码
    • 五.小结
      • 1.容器适配器

stack和queue模拟实现

一.介绍

1.stack的类模板

在这里插入图片描述

LIFO:后进先出

2.queue的类模板

在这里插入图片描述

FIFO:先进先出

3.容器适配器

在stack与queue的介绍中,都有介绍其是容器适配器(container adaptor)的一种,对于适配的模式,反向迭代器也使用了同样的思想

template <class T, class Container = deque<T> > 

其模板参数中Container就是其所适配的类的类型,缺省参数为deque

二. deque类

使用STL中的deque时需要包含头文件#include <deque>,并用std::命名空间

1. 简介

deque:是双端队列(double-ended queues),可以在头尾两端进行插入和删除。

示例:下图中,先尾插 1 2 3 4 5,再头插 0 -1。后的结构图示

在这里插入图片描述

详细可见另一篇博主的优质好文:deque(双端队列)容器

是由于容器vector与liste其各有优点

vector:随机访问([]),效率高

list:插入删除,效率高

因此,有大佬期望能够结合这两个容器的优点来设计一个新的容器,于是deque就诞生了。

deque:头尾插入效率高,不需要移动元素;支持随机访问(但比vecotr的效率低)。

但是其也有自身的缺陷:在中间插入元素时,也需要挪动数据,效率低;不适合遍历(需要检查并转跳到其他的小空间buffer)。

因此,在实际中,可能经常需要遍历,大多数情况下,还是回优先考虑vector或list。deque的使用并不多,目前的一个就是:在STL中,被用来作为stack和queue的底层数据结构。

2.常用成员函数

在这里插入图片描述在这里插入图片描述在这里插入图片描述

三. stack模拟实现

1.成员函数

在这里插入图片描述

2.代码

#include <deque>
namespace yyjs
{
    template<class T, class Container = std::deque<T>>

    class stack
    {
    public:
        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:
        Container _c;
    };   
}

可以发现,对于stack类的模拟实现,都是对其Container类型的成员变量进行的适配

四.queue的模拟实现

1.成员函数

在这里插入图片描述

2.代码

#include <deque>

namespace yyjs
{
    template<class T, class Container = std::deque<T>>
    class queue
    {
    public:
        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:
        Container _c;
    };
}

对于queue类的模拟实现,也是对其Container类型的成员变量进行的适配

五.小结

1.容器适配器

对于stackqueue的使用时,对于第二个模板参数可以不传参,也可以指定其底层数据结构

//<int ,deque<int>>
stack<int> sti;
//<int, vector<int>>
stack<int, std::vector<int>> stiv;

需要Container类中实现的有stack成员函数里所调用的empty()、size()、push_back()、pop_front()等函数,才能做为第二个模板参数传入。但是一般不传参,使用deque。

queue同上


🦀🦀观看~~

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

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

相关文章

剖析Linux文件系统

Linux 文件系统体系结构是一个对复杂系统进行抽象化的有趣例子。通过使用一组通用的 API 函数&#xff0c;Linux 可以在许多种存储设备上支持许多种文件系统。例如&#xff0c;read 函数调用可以从指定的文件描述符读取一定数量的字节。read 函数不了解文件系统的类型&#xff…

外包,以后再也不去了....

先说一下自己的个人情况&#xff0c;大专生&#xff0c;18年通过校招进入湖南某软件公司&#xff0c;干了接近3年的点点点&#xff0c;后来我面了几家公司都没面上&#xff0c;最后把我想去外包混几个月的想法和我在腾讯的老哥讲了&#xff0c;他说外包&#xff0c;狗都不去&am…

打开Adobe软件出现弹窗“Adobe app is not available”无法使用的解决方法

运行Adobe软件遇到“Adobe app is not avAIlable”&#xff0c;是因为Adobe程序的 DNS 服务器无法联网验证&#xff0c;那么该怎么解决呢&#xff1f;搜索了一些网友用户的分享&#xff0c;大家可以试试看。 Adobe app 方法很简单&#xff0c;就是hosts添加屏蔽&#xff0c;使…

JDK21要来了,并发编程更加丝滑了

大家好&#xff0c;我是风筝&#xff0c;公众号「古时的风筝」&#xff0c;专注于 Java技术 及周边生态。 我的个人网站&#xff1a;古时的风筝 目前 Java 的最新稳定版是 JDK 20&#xff0c;但这是个过渡版&#xff0c;JDK21就是 LTS 版的了&#xff0c;也快要发布了&#xff…

Neu5Ac Methyl Ester ,145240-80-8用于什么领域?解析化学式:C20H29NO13

为大家介绍&#xff08;CAS&#xff1a;145240-80-8&#xff09;,试剂仅用于科学研究&#xff0c;不可用于人类&#xff0c;非药用&#xff0c;非食用。 CAS号&#xff1a;145240-80-8 分子式&#xff1a;C20H29NO13 分子量&#xff1a;491.44 中文名称&#xff1a;N-乙酰神经氨…

YUV420笔记

YUV420 有YU12、YV12、NV12、NV21 YU12存储格式是 YU12存储格式是YU13中的UV顺序反过来 NV12存储格式是 NV21是NV12数据取反 YUV420_888 是YCbCr的泛化格式&#xff0c;不会具体指明是YU12&#xff0c;YV12&#xff0c;NV12&#xff0c;或是是NV21。它能够表示任何4:2:0的平…

微信小程序实现订阅消息推送的实现步骤

1、准备工作 准备小程序账号、开发环境&#xff0c;我小程序是基于uniapp开发&#xff0c;后台代码基于SpringBoot开发。同时先阅读官方文档&#xff0c;了解小程序订阅消息和后端如何发送订阅消息等相关知识&#xff0c;官方文档地址如下&#xff1a; 《小程序订阅消息》《发…

【C++】4.websocket:websocketpp安装与使用

&#x1f60f;★,:.☆(&#xffe3;▽&#xffe3;)/$:.★ &#x1f60f; 这篇文章主要介绍websocketpp的安装与使用。 学其所用&#xff0c;用其所学。——梁启超 欢迎来到我的博客&#xff0c;一起学习&#xff0c;共同进步。 喜欢的朋友可以关注一下&#xff0c;下次更新不迷…

【Java】《On Java》第12章 集合 读书笔记

结合JavaGuide和《On Java》的集合笔记。 不要使用时代的眼泪Vector、HashTable、Stack。 文章目录 1 泛型与类型安全的集合2 基本概念3 添加一组元素★4 集合的打印5 ListtoArray的使用 ★Collection.sort的使用 6 ArrayList6.1 ArrayList成员变量6.2 ArrayList构造函数6.3 A…

没有公网IP,如何实现数据共享?

数据共享就是让在不同地方使用不同计算机、不同软件的用户能够读取他人数据并进行各种操作、运算和分析。不同层次、不同部门信息系统间&#xff0c;信息和信息产品的交流与共用&#xff0c;就是把信息这一种在互联网时代中重要性越趋明显的资源与其他人共同分享。 数据共享有…

SpeechGen:用提示解锁语音语言模型(Speech LM)的生成能力

论文链接&#xff1a; https://arxiv.org/pdf/2306.02207.pdf Demo: https://ga642381.github.io/SpeechPrompt/speechgen.html Code: https://github.com/ga642381/SpeechGen 引言与动机 大型语言模型 &#xff08;LLMs&#xff09;在人工智能生成内容&#xff08;AIGC…

手动渲染农场和自助云渲染农场的区别

手动渲染农场和自助云渲染农场是两种常见的渲染方式&#xff0c;它们各有优缺点。手动渲染农场指的是在本地使用自己的硬件设备进行渲染&#xff0c;而自助云渲染农场则是利用云服务商提供的计算资源进行渲染。对于需要渲染大规模项目的设计师或工作室来说&#xff0c;选择一种…

网络安全主要学些什么比较重要

网络安全学什么&#xff1f; 第一阶段&#xff1a;基础 入门的第一步是学习当下的一些主流的安全工具和配套的原理基础 第二阶段&#xff1a;学习基础知识 这个阶段的时候对网络安全就有了基本的了解&#xff0c;通过第一步的学习&#xff0c;理论上的知识一定都明白了&…

Python精美图快速上手

seaborn是一个基于Python的数据可视化库&#xff0c;它建立在Matplotlib之上&#xff0c;提供了一种更简单、更美观的方式来创建统计图形。seaborn旨在帮助用户轻松地生成有吸引力和信息丰富的可视化结果。 以下是seaborn库的一些主要特点&#xff1a; 美观的默认样式&#xf…

获取jar包所在路径位置,项目文件夹Path

获取jar包所在路径位置,项目文件夹位置 方法1 new ApplicationHome().getDir().getPath();方法1就是调用了方法2 System.getProperty("user.dir") System.getProperty("user.dir")String源码&#x1f447; private File findHomeDir(File source) {File…

Python 标准库 - 并发执行

Python 标准库 - 并发执行 1. 简单介绍2. 程序示例2.1 threading 编程示例2.2 multiprocessing 编程示例2.3 concurrent.futures 编程示例 1. 简单介绍 Python 标准库 非常庞大&#xff0c;所提供的组件涉及范围十分广泛&#xff0c;官方参考链接https://docs.python.org/zh-cn…

【sentinel】令牌桶算法在Sentinel中的应用

令牌桶算法 令牌桶算法介绍 令牌桶算法&#xff0c;又称token bucket。 从图中我们可以看到&#xff0c;令牌桶算法比漏桶算法稍显复杂。首先&#xff0c;我们有一个固定容量的桶&#xff0c;桶里存放着令牌&#xff08;token&#xff09;。桶一开始是空的&#xff0c;token以…

【深度学习】0-2 深度学习相关数学概念的简单总结-概率与信息论

样本空间 样本空间是一个实验或随机试验所有可能结果的集合&#xff0c;随机试验中的每个可能结果称为样本点。例如投掷一个骰子&#xff0c;那么样本空间就是{1&#xff0c;2&#xff0c;3&#xff0c;4&#xff0c;5&#xff0c;6}。 随机变量 随机变量&#xff0c;顾名思义…

IDEA全局设置JDK、Maven、编码格式

本机已安装JDK版本&#xff1a; 本机已安装Maven版本&#xff1a; 一、IDEA设置全局JDK设置 File---->New Projects Settings---->Structure for New Projects... 先将本地安装的JDK添加到SDK 将项目SDK设置为刚刚添加的本地JDK版本 File---->New Projects Settings-…

Webstorm 加载vue项目时,特别卡顿,完美解决。觉得有用加好友打赏

觉得有用加好友打赏&#xff1a;QQ&#xff1a;854138497 上图cpu直接干满。 根据上图提示&#xff0c;直接 disable hints&#xff0c;或者到下图的settings里面设置。 Code vision取消后&#xff0c;webstorm 明显就不卡了。记得重启webstorm。 还有一种方式&#xff0c;根…