STL中stack和queue模拟实现+容器适配器

news2024/7/6 19:16:06

目录

容器适配器

STL标准库中stack和queue的底层结构

deque的简单介绍

deque的缺陷

为什么选择deque作为stack和queue的底层默认容器

stack的模拟实现

queue的模拟实现 


容器适配器

适配器是一种设计模式(设计模式是一套被反复使用的,多数人知晓的,经过分类编目的、代码设计经验的总结),该种模式是将一个类的接口转换成客户希望的另外一个接口。

STL标准库中stack和queue的底层结构

虽然stack和queue中也可以存放元素,但在STL中并没有将其划分在容器的行列,而是将其称为容器适配器,这是因为stack和队列只是对其他容器的接口进行了包装,STL中stack和queue默认使用deque,比如:

deque的简单介绍

deque(双端队列):是一种双开口的“连续”空间的数据结构,双开口的含义是:可以在头尾两端进行插入和删除操作,且时间复杂度为O(1),与vector比较,头插效率高,不需要搬移元素,与list比较,空间利用率比较高。

deque并不是真正连续的空间,而是由一段段连续的小空间拼接而成的,实际deque类似于一个动态的二维数组,其底层结构如下图所示:

双端队列底层是一段假象的连续的空间,实际是分段连续的,为了维护其“整体连续”以及随机访问的假象,落在看deque的迭代器身上,因此deque的迭代器设计就比较复杂,如下图所示;

那么deque是如何借助其迭代器维护其假想的连续的结构呢?

deque的缺陷

与vector比较,deque的优势是:头部插入和删除时,不需要搬移元素,效率特别高,而且在扩容时也不需要搬移大量的元素,因此其效率是必vector高的。

与list比较,其底层是连续空间,空间利用率比较高,不需要存储额外字段。

但是,deque有一个致命缺陷不适合遍历,因为在遍历时,deque的迭代器要频繁的去检测其是否移动到某段小空间的边界,导致效率低下,而序列式场景中,可能需要经常遍历,因此在实际中,需要线性结构时,大多数情况下优先考虑vector和list,deque的应用并不多,而目前能看到的一个应用就是,STL用其作为stack和queue的底层数据结构

为什么选择deque作为stack和queue的底层默认容器

stack是一种后进先出的特殊线性数据结构,因此只要具有push_back()和pop_back()操作的线性结构,都可以作为stack的底层容器,比如vector和list都可以;queue是先进先出的特殊线性数据结构,只要具有push_back和pop_front操作的线性结构,都可以作为queue的底层容器,比如list。但是STL中对stack和queue默认选择deque作为其底层容器,主要是因为:

1.stack和queue不需要遍历(因此stack和queue没有迭代器),只需要在固定的一端或者两端进行操作。

2. 在stack中元素增长时,deque比tvector的效率高(扩容时不需要搬移大量数据);queue中的元素增长时,deque不仅效率高,而且内存使用率高。

结合了deque的优点,而完美的避开了其缺陷。

stack的模拟实现

#pragma once
 
#include <iostream>
#include <deque>
 
namespace sim_stack
{
    //提供容器缺省参数值为双端队列
    template<class T, class Container = deque<T>>
    class stack
    {
    public:
        //使用对应容器的构造函数
        stack()
            :_con()
        {}
 
        //push()函数
        void push(const T& val)
        {
            //调用类模版容器的push_back()
            _con.push_back(val);
        }
 
        //pop()函数
        void pop()
        {
            //调用类模版容器的pop_back()
            _con.pop_back();
        }
 
        //top()函数_非const版本
        T& top()
        {
            //调用类模版容器的back()
            return _con.back();
        }
        //const版本
        const T& top() const
        {
            //调用类模版容器的back()
            return _con.back();
        }
 
        //empty()函数
        bool empty()
        {
            //调用类模版容器的empty()
            return _con.empty();
        }
 
        //size()函数
        const size_t& size()
        {
            //调用类模版容器的size()
            return _con.size();
        }
    private:
        //直接使用容器
        Container _con;
    };
}

queue的模拟实现 

#pragma once
 
#include <iostream>
#include <deque>
 
namespace sim_queue
{
    template<class T, class Container = deque<T>>
    class queue
    {
    public:
        //使用类模版容器的构造函数
        queue()
            :_con()
        {}
 
        //push()函数
        void push(const T& val)
        {
            //使用类模版容器的push_back()函数
            _con.push_back(val);
        }
 
        //pop()函数
        void pop()
        {
            //使用类模版容器的pop_front()函数
            _con.pop_front();
        }
 
        //front()函数_非const版本
        T& front()
        {
            //使用类模版容器的front()函数
            return _con.front();
        }
        //const版本
        const T& front() const
        {
            //使用类模版容器的front()函数
            return _con.front();
        }
 
        //back()函数_非const版本
        T& back()
        {
            //使用类模版容器的back()函数
            return _con.back();
        }
        //const版本
        const T& back() const
        {
            //使用类模版容器的back()函数
            return _con.back();
        }
        
        //empty()函数
        bool empty()
        {
            //使用类模版容器的empty()函数
            return _con.empty();
        }
 
        //size()函数
        const size_t size()
        {
            //使用类模版容器的size()函数
            return _con.size();
        }
    private:
        Container _con;
    };
}

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

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

相关文章

2024北京消防展6.26召开-看消防安全企业如何升级赋能

2024北京消防展6.26召开-看消防安全企业如何升级赋能 随着社会的快速发展&#xff0c;消防安全已经成为企业安全生产的重要一环。作为消防领域的品质盛会&#xff0c;2024中国&#xff08;北京&#xff09;消防技术与设备展览会将于6月26-28 日在北京.首钢会展中心召开&#xf…

Django 传递额外参数给视图函数

本书1-7章样章及配套资源下载链接: https://pan.baidu.com/s/1OGmhHxEMf2ZdozkUnDkAkA?pwdnanc 源码、PPT课件、教学视频等&#xff0c;可以从前言给出的下载信息下载&#xff0c;大家可以评估一下。 在Django框架中&#xff0c;URLconf模块还支持一种传递额外参数给视图函…

生活使用英语口语柯桥外语学校成人英语学习

● “自来水”英语怎么说&#xff1f; ● “自来水”的英语表达是&#xff1a;Running water或者Tap water. 例句&#xff1a; There are hot and cold running water in all the bedrooms. 所有的卧室里都有冷热自来水。 ● “热水”英文怎么水&#xff1f; ● 我们不管…

upload-labs-第一关和第二关

目录 第一关 思路&#xff1a; 1、上传一个php文件 2、查看源码 3、查看文件上传地址 4、BP抓包&#xff0c;修改文件后缀名 5、使用蚁剑连接 第二关 1、这一关也可以跟第一关一样的方法进行绕过 2、上传一个一句话木马文件 第一关 原理&#xff1a; 思路&#xff1a…

Pyramid Vision Transformer, PVT(ICCV 2021)原理与代码解读

paper&#xff1a;Pyramid Vision Transformer: A Versatile Backbone for Dense Prediction without Convolutions official implementation&#xff1a;GitHub - whai362/PVT: Official implementation of PVT series 存在的问题 现有的 Vision Transformer (ViT) 主要设计…

一键生成迷宫-Word插件-大珩助手新功能

Word大珩助手是一款功能丰富的Office Word插件&#xff0c;旨在提高用户在处理文档时的效率。它具有多种实用的功能&#xff0c;能够帮助用户轻松修改、优化和管理Word文件&#xff0c;从而打造出专业而精美的文档。 【新功能】迷宫生成器 1、可自定义迷宫大小&#xff1b; …

【第二节】C/C++数据结构之线性表

目录 一、线性表基本说明 1.1 基本概念 1.2 抽象数据类型 1.3 存储结构 1.4 插入与删除的区别 1.5 顺序存储和链式存储的优缺点 二、链表 2.1 基本概念 2.2 抽象数据类型 2.3 单链表的定义 2.4 单链表的基本操作 2.5 单链表模板形式的类定义与实现 三、单向循环链…

SpringBoot高手之路03-事务传播行为

那么就是 a事务调用了b事务 日志技术 当解散部门的时候,那么就直接进行 操作日志 就是什么时间点吧部门解散 成功失败都需要记录日志 首先一个日志表 那么日志技术,在电商平台,不论是否支付订单,那么都需要保存订单信息 这个时候我们就使用传播事务 传播事务首先是出现在两…

AI重塑搜索和浏览器,360打造AIPC轻量化方案

6月6日&#xff0c;360AI新品发布会暨开发者沟通会在京举办&#xff0c;360集团发布全新360AI搜索、360AI浏览器&#xff0c;360集团创始人周鸿祎在现场使用360AI搜索为2024年高考语文作文押题。同时&#xff0c;“360AI甄选”平台及会员体系“360AI大会员”正式上线&#xff0…

前端开发常用的工具和软件,提高编程效率

目录 1. 文本编辑器与IDE (集成开发环境)2. 版本控制工具3. 构建工具与包管理器4. 前端框架与库5. 设计与原型工具6. 测试与调试工具7. 代码协作与项目管理8. 自动化部署与持续集成/持续部署(CI/CD)相关链接&#xff1a; 前端开发过程中使用的工具和软件种类繁多&#xff0c;可…

「动态规划」如何求地下城游戏中,最低初始健康点数是多少?

174. 地下城游戏https://leetcode.cn/problems/dungeon-game/description/ 恶魔们抓住了公主并将她关在了地下城dungeon的右下角。地下城是由m x n个房间组成的二维网格。我们英勇的骑士最初被安置在左上角的房间里&#xff0c;他必须穿过地下城并通过对抗恶魔来拯救公主。骑士…

PLC通过Profinet转Modbus网关与流量计通讯案例

1、案例背景 在工业自动化系统中&#xff0c;PLC(可编程逻辑控制器)与流量计之间的通信是保证以后设备生产数据准确传输和实现控制功能的关键。但是&#xff0c;由于PLC和流量计可能使用不同的通信协议(如Profinet和Modbus)&#xff0c;因此需要一种转换机制来实现它们之间的通…

python tqdm怎么安装

tqdm是一个显示循环的进度条的库。taqadum, تقدّم&#xff09;在阿拉伯语中的意思是进展。tqdm可以在长循环中添加一个进度提示信息&#xff0c;用户只需要封装任意的迭代器 tqdm(iterator)&#xff0c;是一个快速、扩展性强的进度条工具库。 tqdm库的安装 在CMD窗口下输…

Day14:响应式网页

通过媒体查询、Bootstrap 框架完成腾讯全端网页响应式布局。 一、响应式布局方案 1、什么是响应式布局 它的主要特点是能够使网页根据不同的设备屏幕尺寸&#xff08;如桌面电脑、平板电脑、手机等&#xff09;和分辨率自动调整布局和显示效果&#xff0c;以提供最佳的用户体…

Django 里的表格内容做修改

当Django里表格内容需要做修改&#xff0c;可以这么操作。 先看效果图 修改后的表格 1. 先得在 asset_list.html 里修改。你们的html有可能跟我不一样 <table border"1px"><thead><tr><th>ID</th><th>标题</th><th…

千问Qwen7B chat:本地部署及网页端使用

基于前面的安装经验&#xff0c;千问大模型的本地部署并不算难&#xff0c;主要时间用在大模型文件的下载上。同时系统运行对硬件也有较高的要求&#xff0c;本机的硬件配置为N卡3060&#xff0c;显存12G。 使用conda创建虚拟环境&#xff0c;主要版本如下&#xff1a; Pyth…

代码随想录算法训练营第30天|回溯复习篇

回溯基础理论 1.回溯的本质是利用递归进行暴力搜索&#xff0c;将符和条件的结果集搜索出来 2.回溯法常见的问题&#xff1a; 组合问题&#xff1a;N个数里面按一定规则找出k个数的集合排列问题&#xff1a;N个数按一定规则全排列&#xff0c;有几种排列方式切割问题&#x…

算法003:快乐数

这道题采用快慢双指针的方法。 为了弄清楚这个题到底是要我们干嘛&#xff0c;我们把整个过程类比一下&#xff1a; 不管是n19还是n2&#xff0c;我们都把它当成一种判断链表是否有环的方式。 对于n19&#xff0c;题干是这样解释的&#xff1a; 我们把它当成链表&#xff0c…

麒麟v10系统arm64架构openssh9.7p1的rpm包

制作openssh 说明 理论上制作的多个rpm在arm64架构&#xff08;aarch64&#xff09;都适用 系统信息&#xff1a;4.19.90-17.ky10.aarch64 GNU/Linux 升级前备份好文件/etc/ssh、/etc/pam.d等以及开启telnet 升级后确认正常后关闭telnet 在之前制作过openssh-9.5p1基础上继续…

算法题--华为od机试考试(围棋的气、用连续自然数之和来表达整数、亲子游戏)

目录 围棋的气 题目描述 输入描述 示例1 输入 输出 解析 答案 用连续自然数之和来表达整数 题目描述 输入描述 输出描述 示例1 输入 输出 说明 示例2 输入 输出 解析 答案 亲子游戏 题目描述 输入描述 输出描述 示例1 输入 输出 说明 示例2 输入…