当前位置: 首页 > news >正文

stackqueue类——适配器模式 双端队列deque(C++)

        接下来我们将实现 stack、queue 类的常用函数,其实对于 stack 和 queue 的常用函数实现可以说得上是非常简单,若想详细了解可以看这篇:栈和队列&循环队列(C/C++)_栈和循环队列-CSDN博客;在本篇中我们将使用容器适配器来实现栈和队列。

目录如下:

目录

1. stack 

 2. queue

3. deque

3.1 deque的原理介绍

3.2 deque 的缺陷

3.3 stack、queue为什么选择deque

1. stack 

        我们首先实现的为 stack,根据 cplusplus 网站来实现 stack 的常用函数,如下:

        如上,对于该 stack 函数而言,就只有以上这些类函数(关于其他的 operator 重载函数不包括)。对于以上每个函数的实现,我们并不会在底层实现它,而是使用容器适配器来实现它,如下直接给出函数:

namespace MyStack_Queue {template<class T, class Container = vector<T>>class stack {public:stack(const Container con = Container()):_con(con){}stack(const stack& st):_con(st._con){}bool empty() {return _con.empty();}size_t size() {return _con.size();}void push(const T& e) {_con.push_back(e);}void pop() {_con.pop_back();}T& top() {return _con.back();}const T& top() const {return _con.back();}void swap(stack& st) {_con.swap(st._con);}private:Container _con;};
}

        如上所示,我们在模板处定义了一个类型和一个容器,这个容器的缺省值为 vector,所以当我们在下面函数的实现中,将成员变量默认定义为了 vector 类(但其实在 stack 底层,大多默认都是使用 deque),然后在实现成员函数的时候,默认调用 vector 类中函数,这样就非常方便的实现了一个栈。

        对于以上容器的缺省值,我们不仅仅可以使用 vector,我们还可以使用 deque,还可以使用 list 来实现,只需要在实例化一个对象的时候将值传入就可以了,如下:

void Test00() {MyStack_Queue::stack<int, list<int>> st;st.push(1);st.push(2);st.push(3);st.push(4);st.push(5);while (!st.empty()) {int tmp = st.top();st.pop();cout << tmp << endl;}cout << endl;}

        如上的测试代码,我们使用了一个 list 容器实现了一个栈。但是在实现栈的时候,还是建议使用 vector 类型。

 2. queue

        queue 的实现和 stack 十分的相似,我们使用容器实现,对于 queue 的成员函数如下:

        下列为我们使用容器实现的代码:

	template<class T,class Container = deque<T>>class queue {public:queue(const Container con = Container()):_con(con){}queue(const Container& q) {_con(q._con);}bool empty() {return _con.empty();}size_t size() {return _con.size();}T& front() {return _con.front();}const T& front() const {return _con.front;}T& back() {return _con.back();}const T& back() const {return _con.back();}void pop() {_con.pop_front();}void push(const T& e) {_con.push_back(e);}void swap(queue& q) {_con.swap(q._con);}private:Container _con;};

        对于以上容器的缺省值,我们使用的是 deque,当然我们使用 list 也是一种高效的方式。

3. deque

        接下来我们将简单的讲解 deque -- 双端队列,仅仅只是讲解其原理和优缺点,并不会实现 deque,因为 deque 的迭代器实现起来很复杂,所以我们仅仅将其作为一个了解的知识即可。

3.1 deque的原理介绍

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

        deque 并不是真正连续的空间,而是由一段段连续的小空间拼接而成的,实际上类似于一个动态的二维数组,其具体的实现原理如下:

        所以具体的空间开辟如上所示,存在一个中控数组,里面存储的是每一个分组的地址,当我们想要获取元素的时候,就是通过这样的结构进行获取的。但是 deque 同时也支持 operator[] 重载函数,所以可以随机访问到我们的元素,在这样的数据结构中,为了维护随机访问假象,那么这个责任就落到了 deque 的迭代器身上,迭代器的设计原理如下:

        所以对于 deque 的迭代器有着四个指针,分别指向不同的地方,所以 deque 最难的是它的迭代器。

3.2 deque 的缺陷

        与 vector 相比,deque 的优势为:头插和尾删时,不需要搬移元素,效率特别的高,而且在扩容的时候,也不需要搬移大量的元素,因此效率比 vector 高。

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

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

3.3 stack、queue为什么选择deque

        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比vector的效率高(扩容时不需要搬移大量数据);queue中的元素增长时,deque不仅效率高,而且内存使用率高。
        其中结合了 deque 的优点,完美的避开了其缺陷。

相关文章:

stackqueue类——适配器模式 双端队列deque(C++)

接下来我们将实现 stack、queue 类的常用函数&#xff0c;其实对于 stack 和 queue 的常用函数实现可以说得上是非常简单&#xff0c;若想详细了解可以看这篇&#xff1a;栈和队列&循环队列&#xff08;C/C&#xff09;_栈和循环队列-CSDN博客&#xff1b;在本篇中我们将使…...

SpringCloud知识点梳理

1. Spring Cloud 综述 1.1 Spring Cloud 是什么 [百度百科]Spring Cloud是⼀系列框架的有序集合。它利⽤Spring Boot的开发便利性巧妙地简化了分布式系统基础设施的开发,如服务发现注册、配置中⼼、消息总线、负载均衡、断路器、数据监控等,都可以⽤ Spring Boot的开发⻛格…...

【NOI】C++程序结构入门之分支结构二

文章目录 前言一、逻辑运算符1.导入2.逻辑与&#xff08;&&&#xff09;3.逻辑或&#xff08;||&#xff09;4.逻辑非&#xff08;!&#xff09; 二、例题讲解问题&#xff1a;1656. 是两位的偶数吗问题&#xff1a;1658. 游乐设施问题&#xff1a;1659. 是否含有数字5…...

web自动化系列-使用普通模式编写测试用例以及存在问题(十六)

前面已经把selenium的主要操作介绍完毕 &#xff0c;接下来我们通过编写几条测试用例感受下selenium的用法 。 1.用例需求 还是以登录为例 &#xff0c;需要实现的测试用例为 &#xff1a; case1&#xff1a;输入正确的用户名和密码进行登录case2 : 输入正确的用户名和错误的…...

VSCode 配置 Qt 开发环境

文章目录 1. 环境说明2. 配置系统环境变量 1. 环境说明 操作系统&#xff1a;Windows 11VSCode版本&#xff1a;1.88.1CMake版本&#xff1a;3.27.7Qt6版本&#xff1a;6.7.0(MinGW 11.2.0 64-bit) 2. 配置系统环境变量 自行根据自己的Qt安装路径配置 配置 MinGW 和 CMake C…...

【Jenkins】持续集成与交付 (七):Gitlab添加组、创建用户、创建项目和源码上传到Gitlab仓库

🟣【Jenkins】持续集成与交付 (七):Gitlab添加组、创建用户、创建项目和源码上传到Gitlab仓库 1、创建组2、创建用户3、将用户添加到组中4、在用户组中创建项目5、源码上传到Gitlab仓库5.1 初始化版本控制5.2 将文件添加到暂存区5.3 提交代码到本地仓库5.4 推送代码到 Git…...

L1-017 到底有多二

一个整数“犯二的程度”定义为该数字中包含2的个数与其位数的比值。如果这个数是负数&#xff0c;则程度增加0.5倍&#xff1b;如果还是个偶数&#xff0c;则再增加1倍。例如数字-13142223336是个11位数&#xff0c;其中有3个2&#xff0c;并且是负数&#xff0c;也是偶数&…...

常用语音识别开源四大工具:Kaldi,PaddleSpeech,WeNet,EspNet

无论是基于成本效益还是社区支持&#xff0c;我都坚决认为开源才是推动一切应用的动力源泉。下面推荐语音识别开源工具&#xff1a;Kaldi&#xff0c;Paddle&#xff0c;WeNet&#xff0c;EspNet。 1、最成熟的Kaldi 一个广受欢迎的开源语音识别工具&#xff0c;由Daniel Pove…...

python笔记 | 哥德巴赫猜想

哥德巴赫猜想&#xff1a;每个不小于6的偶数都可以表示成两个素数之和。 素数&#xff1a;只能被1和自身整除的正整数。就是大于1且除了1和它本身之外没有其他因数的数。例如&#xff0c;2、3、5、7、11等都是素数&#xff0c;而4、6、8、9等则不是素数。 下面这段Python代码…...

IO基础-IO多路复用基础

Java的Selector封装了底层epoll和poll的API&#xff0c;可以通过指定如下参数来调用执行的内核调用, 在Linux平台&#xff0c;如果指定 -Djava.nio.channels.spi.SelectorProvidersun.nio.ch.PollSelectorProvider 则底层调用poll&#xff0c; -Djava.nio.channels.spi.Selec…...

Python机器学习项目开发实战:如何进行人脸识别

注意&#xff1a;本文的下载教程&#xff0c;与以下文章的思路有相同点&#xff0c;也有不同点&#xff0c;最终目标只是让读者从多维度去熟练掌握本知识点。 下载教程&#xff1a; Python机器学习项目开发实战_人脸识别_编程案例解析实例详解课程教程.pdf 人脸识别是一个复杂但…...

管理能力学习笔记五:识别团队角色,因才施用

识别团队角色&#xff0c;因才施用&#xff0c;需要做到以下三点 扬长避短 管理者要学会问自己员工能把什么做好&#xff0c;而不是想方设法改造他们的短处 。 – 彼得德鲁克 人岗匹配 将合适的人放在合适的位置 人才多样化 团队需要各式各样的人才&#xff0c;才能高效配合…...

Real3DPortrait照片对口型,数字人,音频/视频驱动数字人

先看效果 上传一张图片和一段音频&#xff0c;照片如下&#xff1a; 合成后效果如下&#xff1a; 照片对口型-音频驱动 支持音频驱动和视频驱动&#xff0c;视频可以使照片有参照视频中的口型和和动作。 项目地址 https://github.com/yerfor/Real3DPortrait 我的环境 win…...

Stable Diffusion之Ubuntu下部署

1、安装conda环境 conda create -n webui python3.10.6 2、激活环境 每次使用都要激活 conda activate webui 注意开始位置的变换 关闭环境 conda deactivate webui 3、离线下载SD 代码 https://github.com/AUTOMATIC1111/stable-diffusion-webui https://github.com/Stabilit…...

LeetCode-15-三数之和问题

题目说明 给定一个包含 n 个整数的数组 nums&#xff0c;判断 nums 中是否存在三个元素 a&#xff0c;b&#xff0c;c &#xff0c;使得 a b c 0 &#xff1f;找出所有满足条件且不重复的三元组。 注意&#xff1a;答案中不可以包含重复的三元组。 给定数组 nums [-1, 0,…...

springboot2集成东方通tongweb嵌入式版

由于最近项目需要国产化信创改造&#xff0c;引入东方通tongweb 联系东方通厂家 &#xff0c;将依赖导入到maven仓库&#xff0c;并获取嵌入式版license文件修改pom.xml&#xff0c;引入依赖&#xff0c;注意springboot版本&#xff0c;这里以springboot2举例 首先移除springb…...

【二分查找】Leetcode 33. 搜索旋转排序数组【中等】

搜索旋转排序数组 整数数组 nums 按升序排列&#xff0c;数组中的值 互不相同 。 在传递给函数之前&#xff0c;nums 在预先未知的某个下标 k&#xff08;0 < k < nums.length&#xff09;上进行了 旋转&#xff0c;使数组变为 [nums[k], nums[k1], …, nums[n-1], num…...

Zephyr Windows开发环境搭建

Zephyr 如果有错误或未及时更新&#xff0c;请以官网文档为主 官网&#xff1a;https://docs.zephyrproject.org/latest/develop/getting_started/index.htm 下载安装 Chocolatey 这是一个类似于在Linux系统下 yum 和 apt 那样的包管理器 官网&#xff1a;https://chocolat…...

如何安全地设置MySQL数据库的IP白名单

设置MySQL数据库的IP白名单是一种关键的安全措施&#xff0c;可以确保只有来自特定IP地址的请求被允许访问数据库服务器。这里是如何安全地配置这些设置的分步指南。 步骤1: 登录到MySQL服务器 首先&#xff0c;使用管理员权限登录到你的MySQL服务器。如果你使用的是命令行&a…...

Chatgpt掘金之旅—有爱AI商业实战篇|品牌故事业务|(十六)

演示站点&#xff1a; https://ai.uaai.cn 对话模块 官方论坛&#xff1a; www.jingyuai.com 京娱AI 一、AI技术创业在品牌故事业务有哪些机会&#xff1f; 人工智能&#xff08;AI&#xff09;技术作为当今科技创新的前沿领域&#xff0c;为创业者提供了广阔的机会和挑战。随…...

3步玩转Balena Etcher:开源镜像烧录工具完全指南

3步玩转Balena Etcher&#xff1a;开源镜像烧录工具完全指南 【免费下载链接】etcher Flash OS images to SD cards & USB drives, safely and easily. 项目地址: https://gitcode.com/GitHub_Trending/et/etcher Balena Etcher是一款开源跨平台镜像烧录工具&#x…...

5大维度重构Windows体验:开源系统优化方案全解析

5大维度重构Windows体验&#xff1a;开源系统优化方案全解析 【免费下载链接】Atlas &#x1f680; An open and lightweight modification to Windows, designed to optimize performance, privacy and security. 项目地址: https://gitcode.com/GitHub_Trending/atlas1/Atl…...

AIGlasses_for_navigation免配置环境:预置ffmpeg+opencv+torchvision全栈

AIGlasses_for_navigation免配置环境&#xff1a;预置ffmpegopencvtorchvision全栈 1. 引言&#xff1a;让AI视觉开发变得简单 如果你曾经尝试过搭建一个完整的AI视觉处理环境&#xff0c;一定知道那是个多么痛苦的过程&#xff1a;安装CUDA、配置ffmpeg、编译OpenCV、处理各…...

2026年AI前20岗位薪酬出炉!搞AI大模型的远超同行?

AI相关&#xff0c;细分技术领域&#xff0c;薪资前20岗位&#xff0c;都有哪些。 今天这篇文章与铁铁们分享一下。 1 薪资榜单 如下图所示&#xff0c;排名第一&#xff1a;深度学习算法工程师&#xff0c;平均月薪达到3万1千&#xff1b; 排名第二的架构师&#xff0c;薪资与…...

高通平台USB充电背后的秘密:从SBL1阶段到Kernel的电池ID识别全解析

高通平台USB充电与电池ID识别的深度技术解析 在Android设备开发中&#xff0c;电源管理系统的稳定性直接影响用户体验。作为底层驱动工程师&#xff0c;理解高通平台从硬件到软件的完整充电流程至关重要。本文将深入剖析从XBL阶段到Kernel层的电池识别机制&#xff0c;揭示BATT…...

SaaS级AI员工系统源码商用版,多租户+计费系统+API分销,一套源码搞定

温馨提示&#xff1a;文末有资源获取方式最近“龙虾AI”的热度居高不下&#xff0c;到处都在讨论如何“养龙虾”。但观察下来发现&#xff0c;这类应用对普通用户而言技术门槛还是偏高&#xff0c;部署、配置、调试都需要专人跟进&#xff0c;最终往往沦为摆设。源码获取方式在…...

智能文献管理全面指南:从学术研究痛点到高效解决方案

智能文献管理全面指南&#xff1a;从学术研究痛点到高效解决方案 【免费下载链接】zotero Zotero is a free, easy-to-use tool to help you collect, organize, annotate, cite, and share your research sources. 项目地址: https://gitcode.com/gh_mirrors/zo/zotero …...

ae新手福音,用快马平台ai生成带注释的片段视频代码轻松入门

作为一个刚接触AE的新手&#xff0c;第一次打开软件时确实被复杂的界面吓到了。各种面板、时间轴、效果控件看得眼花缭乱&#xff0c;更别说要自己写表达式了。直到发现了InsCode(快马)平台&#xff0c;用自然语言描述就能生成带详细注释的AE项目代码&#xff0c;简直是新手的救…...

别再只调库了!拆解一个智能家居语音项目,聊聊STM32裸机开发中多任务处理的几种实用思路

裸机开发的艺术&#xff1a;STM32智能家居项目中多任务处理的五种高阶策略 从智能家居项目看裸机开发的挑战与机遇 在嵌入式开发领域&#xff0c;RTOS&#xff08;实时操作系统&#xff09;的普及让许多开发者形成了思维定式——面对多任务需求时&#xff0c;第一反应往往是移植…...

Python实战:用LangGraph和MCP打造你的第一个AI代理(附完整代码)

Python实战&#xff1a;用LangGraph和MCP构建智能代理的完整指南 在当今快速发展的AI领域&#xff0c;构建能够理解和执行复杂任务的智能代理已成为开发者关注的焦点。本文将带您深入了解如何利用LangGraph框架和模型上下文协议(MCP)构建一个功能完备的AI代理&#xff0c;从基础…...