【STL源码剖析-空间配置器】stack、queue简单实现

举头天外望

无我这般人


目录

stack 的概述

stack 的实现

queue 的概述

queue 的实现

契子


我们之前学过了 vector、list 这些 STL 的(容器)

而我们今天将要学习空间配置器 -- stack、queue,那什么是空间配置器呢?

简单来讲就是 stack、queue 的底层完成工作具有<修改其他容器所形成的另一种风貌>的性质,所以被称为 adapter (配置器)


stack 的概述

stack 是一种先进后出的结构,它只有一个出口。stack 允许新增元素、移除元素、取得最顶端元素。但除了最顶端之外,没有任何其他方法可以存取 stack 的其他元素。换而言之 stack 不允许有走访行为

将元素推入 stack 的动作叫做 push,将元素推出 stack 的动作叫做 pop 

以某种既有容器作为底部,将其介面改变,使符合 [先进后出] 的特性,形成一个 stack,是很容易做到的。比如:vector (顺序栈)、list (链栈)、deque,我们以 vector 为例:vector 是面向开口的资料节点,若以 vector 的头部为封闭的 stack 的底部,尾部为 stack 开口的顶部,就轻而易举地形成了一个 stack 。因此,我们可以将 vector 作为预设情况下的 stack 的底层结构,stack 的实现非常简单这里完整列出:

stack 的实现

	template<class T, class Sequence = vector<T> >class stack{public:void push(const T& val){c.push_back(val);}void pop(){c.pop_back();}const T& top() const{return c.back();}bool empty() const{return c.empty();}size_t size() const{return c.size();}private:Sequence c;};

我们发现 stack 会意底层容器完成所有工作,而这种具有 [ 修改/套用 其他容器,形成的另一种风貌] 的性质称之为空间配置器container adapter

	template<class T, class Sequence = vector<T> >

我们右边的赋值行为其实就是传缺省值,对的 ~ 模板也能传缺省值哦

除了能传 vector 还可以传 list、deque(这个容器之后会讲)

如果不传就会默认用 vector 的底层,传了就会用你所指定的底层操作

如果你真的想要传的话 ~ 就是这个酱紫

stack<int, list<int>> str;

可能有老铁会问:为什么没有看到构造析构呢?因为不写即正义:

默认构造函数会自动调用自定义类型成员变量的构造函数

默认析构函数会自动调用自定义类型成员变量的析构函数

这里先提一下:

stack 没有迭代器 ! stack 的所有元素的进出都符合 [后进先出] 的条件,只有 stack 的顶端元素,才会被外界取用。所以 stack 不提供走访功能,也不提供迭代器

代码测试:

void stack_test()
{stack<int> str;str.push(1);str.push(2);str.push(3);str.push(4);while (!str.empty()){std::cout << str.top() << " ";str.pop();}return 0;
}

我们知道 stack 有很多与之匹配的容器,我这里就不一一展示了,直接拿过来测试一下呗

void stack_test()
{stack<int,list<int>> str;str.push(1);str.push(2);str.push(3);str.push(4);while (!str.empty()){std::cout << str.top() << " ";str.pop();}std::cout << std::endl;stack<int, deque<int>> arr;arr.push(5);arr.push(6);arr.push(7);arr.push(8);while (!arr.empty()){std::cout << arr.top() << " ";arr.pop();}std::cout << std::endl;
}


 

queue 的概述

queue 是一种先进先出的结构,它有两个出口。queue 允许新增元素、移除元素、从最底层加入元素、取得最顶端的元素。但除了最低端可以加入、最顶端可以取出,没有任何其他方法可以存取 queue 的其他数据。换而言之 queue 不允许有走访行为,也就不提供迭代器

 将元素推入 queue 的动作称为 push、将元素推出 queue 的动作称为 pop

以某种既有的容器作为底层,将其介面改变,使其符合 [先进先出] 的特性,形成一个 queue 很容易做到。比如:listdequedeque 是一个双端队列,可以在队列的两端进行元素的插入和删除操作),我们若以 list 为底部为入口增数据,头部为出口删数据,就可以形成 queue。我们可以将 list 作为预设情况下的 queue 的底层结构,queue 的实现非常简单这里完整列出:

 

queue 的实现

	template <class T, class Sequence = list<T> >class queue{public:bool empty() const{return c.empty();}size_t size() const {return c.size();}T& front(){return c.front();}const T& front() const{return c.front();}T& back(){return c.back();}const T& back() const{return c.back(); }void push(const T& x){c.push_back(x); }void pop() {c.pop_front(); }private:Sequence c;};

这就完成了 ~ 是不是很简单 -- 因为空间配置器的底层都是依据某种容器,简单来说就是容器套个壳,功能受到了限制罢了

代码测试:

void queue_test()
{queue<int> str;str.push(1);str.push(2);str.push(3);str.push(4);while (!str.empty()){std::cout << str.front() << " ";str.pop();}
}

有不对的地方欢迎指出 ~ ✨ 

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

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

相关文章

AI自动化办公:批量将Excel表格英文内容翻译为中文

有一个50列的表格&#xff0c;里面都是英文&#xff0c;要翻译成中文&#xff1a; 在ChatGPT中输入提示词&#xff1a; 你是一个开发AI大模型应用的Python编程专家&#xff0c;要完成以下任务的Python脚本&#xff1a; 打开Excel文件&#xff1a;"F:\AI自媒体内容\AI行业…

HTML静态网页成品作业(HTML+CSS)——我的班级介绍网页(2个页面)

&#x1f389;不定期分享源码&#xff0c;关注不丢失哦 文章目录 一、作品介绍二、作品演示三、代码目录四、网站代码HTML部分代码 五、源码获取 一、作品介绍 &#x1f3f7;️本套采用HTMLCSS&#xff0c;未使用Javacsript代码&#xff0c;共有1个页面。 二、作品演示 三、代…

金属切削机床5G智能工厂工业物联数字孪生,推进制造业数字化转型

金属切削机床5G智能工厂工业物联数字孪生&#xff0c;推进制造业数字化转型。随着工业4.0时代的到来&#xff0c;制造业正面临着前所未有的变革与挑战。在这场变革中&#xff0c;金属切削机床智能工厂工业物联数字孪生平台正成为推动制造业数字化转型的重要力量。 数字孪生是指…

香港云服务器好还是国内的好?

香港云服务器与国内云服务器各有其优点和缺点&#xff0c;选择哪种类型的云服务器主要取决于业务需求、用户群体、网络需求以及成本考虑。以下是对两者进行详细比较的内容。 首先&#xff0c;从网络速度和稳定性来看&#xff0c;香港云服务器具有独特的优势。由于香港是全球数据…

企业文件加密:保障知识产权与客户隐私

在数字化时代&#xff0c;企业文件的安全成为了保护知识产权和客户隐私的关键。随着网络攻击和数据泄露事件的日益增多&#xff0c;企业必须采取强有力的措施来确保其敏感信息的安全。文件加密技术作为一项重要的数据保护手段&#xff0c;对于维护企业的竞争力和客户信任至关重…

图解支付系统的渠道路由设计

大家好&#xff0c;我是隐墨星辰&#xff0c;今天和大家聊聊渠道路由设计。 这篇文章主要讲清楚&#xff1a;渠道路由是什么&#xff0c;为什么需要渠道路由&#xff0c;渠道路由的几种形态&#xff0c;一个简洁而实用的基于规则的渠道路由设计。 注&#xff1a;有些公司称渠…

企业微信H5授权登录

在企业中如果需要在打开的网页里面携带用户的身份信息&#xff0c;第一步需要获取code参数 如何实现企业微信H5获取当前用户信息即accessToken&#xff1f; 1.在应用管理--》创建应用 2.创建好应用&#xff0c;点击应用主页-》设置-》网页-》将授权链接填上去 官方文档可以看…

wampserver的使用

wampserver的使用 文章目录 wampserver的使用1.启动2.目录3.基本操作 1.启动 WampServler有三种状态 服务器关闭状态&#xff0c;颜色为红色服务器开启&#xff0c;但是为离线状态&#xff0c;颜色为橙色&#xff0c;只有本机可以访问服务器开启&#xff0c;在线状态&#xf…

Educational Codeforces Round 166 (Rated for Div. 2)题解(A,B,D)

今天真的巨抽象&#xff0c;第三题没做出来&#xff0c;但是第四题过了&#xff0c;也是准备上小分了&#xff0c;因为nnd不按那个分数&#xff0c;而是按照做题数&#xff0c;直接废了 A. Verify Password 题解&#xff1a;小丑水题一个人&#xff0c;按照ASCII码比较一遍直接…

SDK开发

为什么需要Starter&#xff1f; 理想情况:开发者只需关心调用哪些接口&#xff0c;传递哪些参数就跟调用自己写的代码一样简单。 开发starter的好处&#xff1a;开发者引入之后&#xff0c;可以直接在application.yml中写配置&#xff0c;自动创建客户端。 starter开发流程 …

STM32G030C8T6:EEPROM读写实验(I2C通信)--M24C64

本专栏记录STM32开发各个功能的详细过程&#xff0c;方便自己后续查看&#xff0c;当然也供正在入门STM32单片机的兄弟们参考&#xff1b; 本小节的目标是&#xff0c;系统主频64 MHZ,采用高速外部晶振&#xff0c;实现PB11,PB10 引脚模拟I2C 时序&#xff0c;对M24C08 的EEPRO…

javascript DOM 设置样式

No.内容链接1Openlayers 【入门教程】 - 【源代码示例300】 2Leaflet 【入门教程】 - 【源代码图文示例 150】 3Cesium 【入门教程】 - 【源代码图文示例200】 4MapboxGL【入门教程】 - 【源代码图文示例150】 5前端就业宝典 【面试题详细答案 1000】 文章目录 一、直接…

【易错题】数据统计补充习题(选择题 )#CDA Level 1

本文整理了数据统计相关的易错题&#xff0c;部分可作为备考CDA Level 1统计学部分的补充习题。来源&#xff1a;如荷学题库&#xff08;CFDP第三部分&#xff09; 1&#xff09; 2&#xff09; 3&#xff09; 4&#xff09; 5&#xff09; 6&#xff09; 7&#xff09; 8&…

shopee签名x-sap-ri、x-sap-sec算法还原

最新版签名&#xff0c;免账号登录成功率百分百&#xff0c;需要可d 两种方式base64 MTQzMDY0OTc3OA QXVndXN0MjItZnF4

【项目经理】什么是领导

引言&#xff1a;        项目管理是一个不断发展的领域&#xff0c;它要求项目经理不断学习、适应和创新。通过本系列文章&#xff0c;我们希望能够帮助每一位项目经理提升自己的专业能力&#xff0c;成为引领项目成功的舵手。 持续更新。。。。。。。。。。。。。。。…

Blueprints - Collision Presets相关

一些以前的学习笔记归档&#xff1b; 在Static Mesh或SkeletalMesh等的属性中&#xff0c;都有Collision Presets&#xff1a; 其中Oject Type只是一个枚举参数&#xff0c;代表设置该Actor为什么类型&#xff0c;Collision Responses代表该Actor对各种类型的Actor有什么反应&a…

DataGrip 数据库连接客户端

I DataGrip 安装 1.1安装 打开dmg镜像&#xff0c;将“DataGrip.app”拖入应用程序中&#xff1b; 1.2 Act 打开应用程序,点击试用模式启动软件&#xff0c;然后将“jetbrains-agent-latest”拖到任意位置&#xff0c;然后拖入&#xff0c;弹出对话框&#xff0c;点击“Rest…

Java web应用性能分析之【压测工具ab】

常用的性能测试工具有&#xff1a;JMeter、loadRunner、ab&#xff1b;对于开发人员来说用的多的是免费的Jmeter和ab&#xff0c;对于测试来说可能用收费的商业软件loadRunner多。在这里我们就说说ab压测工具&#xff0c;因为ab基本满足web接口测试要求&#xff0c;jmeter后面再…

LabVIEW车体静强度试验台测控系统

LabVIEW车体静强度试验台测控系统 开发了一种基于LabVIEW的车体静强度试验台测控系统&#xff0c;通过自动化技术提高试验的精度和效率。系统采用LabVIEW软件与S7-200 SMART PLC硬件平台相结合&#xff0c;实现了对液压缸作用力的精确控制和试验数据的实时采集及管理。 传统的…

通用代码生成器应用场景四,跨编程语言翻译

通用代码生成器应用场景四&#xff0c;跨编程语言翻译 如果您有一个Java工程&#xff0c;想把它移植到Rust或Golang语言中去&#xff0c;希望尽可能加快研发速度。 如果您的系统是通用代码生成器开发的&#xff0c;保留了系统的SGS源文件或者SGS2的Excel模板&#xff0c;您可…