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

【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();}
}

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

相关文章:

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

举头天外望 无我这般人 目录 stack 的概述 stack 的实现 queue 的概述 queue 的实现 契子✨ 我们之前学过了 vector、list 这些 STL 的&#xff08;容器&#xff09; 而我们今天将要学习空间配置器 -- stack、queue&#xff0c;那什么是空间配置器呢&#xff1f; 简单来讲就是…...

VR导航的实现原理、技术优势和应用场景

VR导航通过虚拟现实技术提供沉浸式环境&#xff0c;结合室内定位技术实现精准导航。目前&#xff0c;VR导航已在多个领域展现出其独特的价值和潜力&#xff0c;预示着智能导航系统的未来发展。 一、实现原理 VR导航技术依托于虚拟现实(VR)和室内定位系统。VR技术利用计算机模…...

淘宝镜像的https证书过期

错误原因&#xff1a; 淘宝镜像过期 早在 2021 年&#xff0c;淘宝就发文称&#xff0c;npm 淘宝镜像已经从 http://registry.npm.taobao.org 切换到了 http://registry.npmmirror.com。旧域名也将于 2022 年 5 月 31 日停止服务&#xff08;直到 HTTPS 证书到期才真正不能用了…...

VSCODE 常用快捷键

快捷按键 注释 CTRL /CTRL KSHIFT ALT A取消注释 CTRL /CTRL KSHIFT ALT A搜索文件 Ctrl P移动到某一行 Ctrl g打开一个新窗口 Ctrl Shift N关闭窗口 Ctrl Shift W新建文件 Ctrl N文件间切换 Ctrl Tab全部文件搜索 Ctrl Shift F全屏 F11 打开文件出现中文乱码 文件右下角…...

医院该如何应对网络安全?

在线医生咨询受到很多人的关注&#xff0c;互联网医疗行业的未来发展空间巨大&#xff0c;但随着医院信息化建设高速发展 医院积累了大量的患者基本信息、化验结果、电子处方、生产数据和运营信息等数据 这些数据涉及公民隐私、医院运作和发展等多因素&#xff0c;医疗行业办…...

【qt】多窗口开发

多窗口开发 一.应用场景二.嵌入的窗口1.设计Widget窗口2.创建窗口3.添加窗口4.总代码 三.独立的窗口1.创建窗口2.显示窗口 四.总结 一.应用场景 多窗口,顾名思义,有多个窗口可以供我们进行操作! 截个小图,你应该就知道了 OK,话不多说,直接开干,先来设计我们的主窗口 需要蔬菜…...

iOS Hittest 机制和实际应用

Hittest 机制原理 hitTest的原理就是&#xff0c;当我们点击的时候&#xff0c;会触发 window的 hittest方法&#xff0c;在该方法中会首先使用point inside方法判断 点击的地方是否在window范围内&#xff0c;如果在的话&#xff0c;就倒序遍历姿子视图&#xff0c;然后将poi…...

C# 工厂模式学习

工厂模式&#xff08;Factory Pattern&#xff09;是一种创建型设计模式&#xff0c;它提供了一种创建对象的接口&#xff0c;而不是通过具体类来实例化对象。工厂模式可以将对象的创建过程封装起来&#xff0c;使代码更具有灵活性和可扩展性。 工厂模式有几种常见的实现方式&…...

AI生成微信职业头像

加油&#xff0c;新时代打工人&#xff01; 真别说&#xff0c;还挺好看的 https://chatglm.cn/main/alltoolsdetail...

遥感图像的深度学习的任务类型

在遥感图像的深度学习任务中&#xff0c;利用深度学习技术处理和分析遥感图像已经成为一个重要的研究方向。遥感图像来自卫星、无人机等设备&#xff0c;包含了丰富的地球表面信息。以下是遥感图像深度学习中的主要任务类型&#xff1a; 1. 图像分类&#xff08;Image Classif…...

162.二叉树:填充每个节点的下一个右侧节点指针(力扣)

代码解决 /* // Definition for a Node. class Node { public:int val;Node* left;Node* right;Node* next;Node() : val(0), left(NULL), right(NULL), next(NULL) {}Node(int _val) : val(_val), left(NULL), right(NULL), next(NULL) {}Node(int _val, Node* _left, Node* _…...

NLP(20)--知识图谱+实体抽取

前言 仅记录学习过程&#xff0c;有问题欢迎讨论 基于LLM的垂直领域问答方案&#xff1a; 特点&#xff1a;不是通用语料&#xff1b;准确度要求高&#xff0c;召回率可以低&#xff08;转人工&#xff09;&#xff1b;拓展性和可控性&#xff08;改变特定内容的回答&#xf…...

【mysql数据库】mycat中间件

MyCat 简介 Mycat 是数据库 中间件 。 1、 数据库中间件 中间件 是一类连接软件组件和应用的计算机软件&#xff0c; 以便于软件各部件之间的沟通 。 例子 Tomcat web 中间件 。 数据库 中间件 连接 java 应用程序和数据库 2、 为什么要用 Mycat ① Java 与数据库紧耦合 …...

满帮集团 Eureka 和 ZooKeeper 的上云实践

作者&#xff1a;胡安祥 满帮集团&#xff0c;作为“互联网物流”的平台型企业&#xff0c;一端承接托运人运货需求&#xff0c;另一端对接货车司机&#xff0c;提升货运物流效率。2021 年美股上市&#xff0c;成为数字货运平台上市第一股。根据公司年报&#xff0c;2021 年&a…...

ubuntu中彻底删除mysql (配置文件删除可选)

ubuntu中彻底删除mysql (配置文件删除可选) 对于此类即搜即用的分享文章&#xff0c;也不过多赘述&#xff0c;直接依次按照下面的操作执行即可&#xff1a; 一、删除 mysql 数据文件 sudo rm /var/lib/mysql/ -R二、删除 mysql 配置文件 sudo rm /etc/mysql/ -R三、查看 m…...

根据模板和git commit自动生成日·周·月·季报

GitHub - qiaotaizi/dailyreport: 日报生成器 GitHub - yurencloud/daily: 程序员专用的日报、周报、月报、季报自动生成器&#xff01; config.json: { "Author": "gitname", "Exclude": ["update:", "add:", "…...

matlab GUI界面设计

【实验内容】 用MATLAB的GUI程序设计一个具备图像边缘检测功能的用户界面&#xff0c;该设计程序有以下基本功能&#xff1a; &#xff08;1&#xff09;图像的读取和保存。 &#xff08;2&#xff09;设计图形用户界面&#xff0c;让用户对图像进行彩色图像到灰度图像的转换…...

MyBatis 面试题

一、什么是 Mybatis? 1、Mybatis 是一个半 ORM(对象关系映射)框架,它内部封装了 JDBC,开发时 只需要关注 SQL 语句本身,不需要花费精力去处理加载驱动、创建连接、创建 statement 等繁杂的过程。程序员直接编写原生态 sql,可以严格控制 sql 执行性 能,灵活度高。 …...

C#根据数据量自动排版标签的样例

这是一个C#根据数据量自动排版标签的样例 using System; using System.Collections.Generic; using System.Data.SqlClient; using System.Drawing; using System.Text; using System.Threading; using System.Threading.Tasks; using System.Windows.Forms; using HslCommuni…...

【网络安全】Web安全基础 - 第一节:使用软件及环境介绍

VMware VMware&#xff0c;是全球云基础架构和移动商务解决方案的佼佼者。 VMware可是一个总部位于美国加州帕洛阿尔托的计算机虚拟化软件研发与销售企业呢。简单来说&#xff0c;它就是通过提供虚拟化解决方案&#xff0c;让企业在数据中心改造和公有云整合业务上更加得心应…...

【Linux】shell脚本忽略错误继续执行

在 shell 脚本中&#xff0c;可以使用 set -e 命令来设置脚本在遇到错误时退出执行。如果你希望脚本忽略错误并继续执行&#xff0c;可以在脚本开头添加 set e 命令来取消该设置。 举例1 #!/bin/bash# 取消 set -e 的设置 set e# 执行命令&#xff0c;并忽略错误 rm somefile…...

AI Agent与Agentic AI:原理、应用、挑战与未来展望

文章目录 一、引言二、AI Agent与Agentic AI的兴起2.1 技术契机与生态成熟2.2 Agent的定义与特征2.3 Agent的发展历程 三、AI Agent的核心技术栈解密3.1 感知模块代码示例&#xff1a;使用Python和OpenCV进行图像识别 3.2 认知与决策模块代码示例&#xff1a;使用OpenAI GPT-3进…...

376. Wiggle Subsequence

376. Wiggle Subsequence 代码 class Solution { public:int wiggleMaxLength(vector<int>& nums) {int n nums.size();int res 1;int prediff 0;int curdiff 0;for(int i 0;i < n-1;i){curdiff nums[i1] - nums[i];if( (prediff > 0 && curdif…...

el-switch文字内置

el-switch文字内置 效果 vue <div style"color:#ffffff;font-size:14px;float:left;margin-bottom:5px;margin-right:5px;">自动加载</div> <el-switch v-model"value" active-color"#3E99FB" inactive-color"#DCDFE6"…...

BCS 2025|百度副总裁陈洋:智能体在安全领域的应用实践

6月5日&#xff0c;2025全球数字经济大会数字安全主论坛暨北京网络安全大会在国家会议中心隆重开幕。百度副总裁陈洋受邀出席&#xff0c;并作《智能体在安全领域的应用实践》主题演讲&#xff0c;分享了在智能体在安全领域的突破性实践。他指出&#xff0c;百度通过将安全能力…...

Mysql中select查询语句的执行过程

目录 1、介绍 1.1、组件介绍 1.2、Sql执行顺序 2、执行流程 2.1. 连接与认证 2.2. 查询缓存 2.3. 语法解析&#xff08;Parser&#xff09; 2.4、执行sql 1. 预处理&#xff08;Preprocessor&#xff09; 2. 查询优化器&#xff08;Optimizer&#xff09; 3. 执行器…...

Mysql8 忘记密码重置,以及问题解决

1.使用免密登录 找到配置MySQL文件&#xff0c;我的文件路径是/etc/mysql/my.cnf&#xff0c;有的人的是/etc/mysql/mysql.cnf 在里最后加入 skip-grant-tables重启MySQL服务 service mysql restartShutting down MySQL… SUCCESS! Starting MySQL… SUCCESS! 重启成功 2.登…...

MFC 抛体运动模拟:常见问题解决与界面美化

在 MFC 中开发抛体运动模拟程序时,我们常遇到 轨迹残留、无效刷新、视觉单调、物理逻辑瑕疵 等问题。本文将针对这些痛点,详细解析原因并提供解决方案,同时兼顾界面美化,让模拟效果更专业、更高效。 问题一:历史轨迹与小球残影残留 现象 小球运动后,历史位置的 “残影”…...

uniapp 开发ios, xcode 提交app store connect 和 testflight内测

uniapp 中配置 配置manifest 文档&#xff1a;manifest.json 应用配置 | uni-app官网 hbuilderx中本地打包 下载IOS最新SDK 开发环境 | uni小程序SDK hbulderx 版本号&#xff1a;4.66 对应的sdk版本 4.66 两者必须一致 本地打包的资源导入到SDK 导入资源 | uni小程序SDK …...

Caliper 负载(Workload)详细解析

Caliper 负载(Workload)详细解析 负载(Workload)是 Caliper 性能测试的核心部分,它定义了测试期间要执行的具体合约调用行为和交易模式。下面我将全面深入地讲解负载的各个方面。 一、负载模块基本结构 一个典型的负载模块(如 workload.js)包含以下基本结构: use strict;/…...