c++ 容器适配器
Container
//创建一个命名空间,避免和库里的冲突
namespace chen
{//写一个模版template<class T, class Container = deque<T>>//开始写我们的类class stack{public:void push(const T& x){_con.push_back(x);}void pop(){_con.pop_back();}const T& top(){_con.back(); }bool empty(){return _com.empty();}size_t size(){return _con.size();}private:Container _con;};}
上面代码就是一个容器适配器,这上面的代码可以被认为是一个容器适配器,因为它采用了一个已有的容器(通过模板参数 Container
)来实现栈的功能。容器适配器是一种在标准容器之上提供额外接口或修改现有接口的抽象层。
让我们看看为什么这个类可以被看作是一个容器适配器:
-
使用模板参数
Container
:通过使用模板参数Container
,这个栈类允许用户选择不同的容器类型来存储数据。用户可以传入任何符合栈要求的容器,例如std::vector
、std::deque
、或者其他符合要求的容器类型。 -
封装容器操作:该栈类封装了底层容器的操作,如
push_back
、pop_back
、back
等,通过公共接口提供对这些操作的访问。这使得用户可以使用栈的接口而不必直接与底层容器进行交互。 -
提供栈的特定接口:栈有其自己的特定接口,如
push
、pop
、top
、empty
和size
。这些接口反映了栈的行为,而底层容器的细节被封装在栈类内部。
因此,尽管 stack
类使用了一个已有的容器,但它提供了栈的抽象接口,允许用户通过栈的方式使用底层容器。这种通过封装和提供特定接口的方式,使得栈类成为容器适配器。
deque
deque(双端队列)是C++标准库中的一种容器,它是一种双向开口的连续线性空间,可以在头部和尾部进行快速的插入和删除操作。deque是"double-ended queue"的缩写,它允许在队列的两端执行高效的操作。
以下是deque的一些特点和解释:
-
双向开口:deque允许在头部和尾部进行元素的插入和删除操作,而且这些操作都是高效的,不会像vector那样需要移动大量元素。
-
连续线性空间:deque内部通常由多个连续的缓冲区组成,这些缓冲区会动态分配和管理,以保持高效的操作。这种设计使得deque可以在内部分段存储数据,而不需要像vector那样连续存储。
-
随机访问:deque支持随机访问,就像数组一样,可以通过索引来访问元素,而且访问操作的时间复杂度是常数时间。
-
动态增长:deque可以动态增长,当需要存储更多元素时,会自动分配新的缓冲区,并将元素复制到新的缓冲区中。
-
插入和删除效率高:由于deque的双向开口特性,插入和删除元素的效率非常高,不仅仅限于队列的末尾,还可以在队列的前端进行操作。
总之,deque是一种非常灵活和高效的数据结构,适用于需要频繁在队列两端进行操作的情况。它是STL(标准模板库)中的一个重要组件,可以用来解决各种问题,包括队列、栈、双端队列等。
deque(双端队列)不仅可以对队头和队尾的元素进行操作,还可以对队列中间的元素进行操作。这是deque与其他容器(如vector)的主要不同之处。
deque支持以下操作:
-
头部插入和删除:你可以在deque的头部插入元素,也可以从头部删除元素,这些操作是高效的。
-
尾部插入和删除:类似地,你可以在deque的尾部插入元素,也可以从尾部删除元素,这也是高效的。
-
中间插入和删除:deque允许在队列中间插入元素或删除元素,虽然这些操作相对于头部和尾部的操作来说稍微复杂一些,但依然是高效的。你可以使用迭代器来访问和操作deque中的任何元素。
这种双向开口的特性使deque非常灵活,可以用于各种场景,不仅仅局限于队列的两端操作。deque在需要随机访问、插入和删除操作的情况下非常有用,因为它可以在常数时间内执行这些操作,而不需要移动大量元素。这使得deque成为STL中一个重要的容器类型。
但是 deque
只是会的多,你可以理解为:会的比vector
和 list
多,但不精通
template< class T, class Container = deque<T> >
这是C++中的模板类定义,具体解释如下:
template< class T, class Container = std::deque<T> >
-
template<...>
: 这是模板的声明,表明接下来定义的是一个模板类或模板函数。 -
class T
: 这里定义了一个模板参数T
,表示该模板类将接受一个类型参数。T
是用户在使用该模板类时需要提供的类型。 -
class Container = std::deque<T>
: 这是另一个模板参数Container
,它有一个默认值为std::deque<T>
。这意味着用户可以选择在使用该模板类时提供自定义的容器类型,如果未提供,则默认使用std::deque<T>
作为容器类型。std::deque<T>
是 C++ 标准库中的双端队列容器,它允许在两端高效地进行元素的插入和删除操作。
所以,这个模板类 stack
接受两个模板参数:
T
:表示栈中存储的元素类型。Container
:表示存储元素的容器类型,默认为std::deque<T>
。
这种设计使得用户可以根据需要选择不同的元素类型和容器类型来实例化这个栈类。例如,可以实例化一个存储 int
类型的栈,使用默认的容器类型 std::deque<int>
,也可以实例化一个存储 double
类型的栈,使用其他自定义容器类型。
相关文章:
c++ 容器适配器
Container //创建一个命名空间,避免和库里的冲突 namespace chen {//写一个模版template<class T, class Container deque<T>>//开始写我们的类class stack{public:void push(const T& x){_con.push_back(x);}void pop(){_con.pop_back();}const …...
正则表达式的应用领域及基本语法解析
目录 一、正则表达式的应用领域 1. 文本搜索和替换 2. 表单验证 3. 数据提取和分析 4. 数据清洗和处理 5. URL路由和路由匹配 二、正则表达式的基本语法 1. 字符匹配 2. 元字符和字符类 3. 量词和边界 4. 分组和捕获 5. 转义字符 三、常见正则表达式示例 1. 邮箱…...

CIP或者EtherNET/IP中的PATH是什么含义?
目录 SegmentPATH举例 最近在学习EtherNET/IP,PATH不太明白,翻了翻规范,在这里记个笔记。下面的叙述可能是中英混合,有一些是规范中的原文我直接搬过来的。我翻译的不准确。 Segment PATH是CIP Segment中的一个分类。要了解PATH…...
使用lombok进行bulider之后调取HashMap的自定义方法进行对象操作报空指针异常(pojo也适用)
概论 这主要的问题就是bulider的特性的问题,就是他只能给你搭建了一个脚手架,里面的东西其实他没动你的,你得自己去给他实体化,如果你使用了类似HashMap等集合的话,你得自己去bulid一个在那个里面作为初始化对象你才可…...

矩阵-day14
...

上古神器:十六位应用程序 Debug 的基本使用
文章目录 参考环境上古神器 DebugBug 与 DebuggingDebugDebug 应用程序淘汰原因使用限制 DOSBox学习 Debug 的必要性DOSBox-X Debug 的基本使用命令 R查看寄存器的状态修改寄存器的内容 命令 D显示内存中的数据指定起始内存空间地址指定内存空间的范围 命令 A使用命令语法错误查…...

[学习笔记]ARXML - Data Format
参考AUTOSAR文档: https://www.autosar.org/fileadmin/standards/R22-11/FO/AUTOSAR_TPS_ARXMLSerializationRules.pdfhttps://www.autosar.org/fileadmin/standards/R22-11/FO/AUTOSAR_TPS_ARXMLSerializationRules.pdf 编码 arxml只允许使用UTF-8编码ÿ…...

Go_原子操作和锁
原子操作和锁 本文先探究并发问题,再探究锁和原子操作解决问题的方式,最后进行对比。 并发问题 首先,我们看一下程序 num该程序表面看上去一步就可以运行完成,但是实际上,在计算机中是分三步运行的,如下…...

初识Java 12-1 流
目录 Java 8对流的支持 流的创建 随机数流 int类型的区间范围 generate() iterate() 流生成器 Arrays 正则表达式 本笔记参考自: 《On Java 中文版》 ||| 流的概念:流是一个与任何特定的存储机制都没有关系的元素序列。 流与对象的成批处理有关…...

【软件工程_UML—StartUML作图工具】startUML怎么画interface接口
StartUML作图工具怎么画interface接口 初试为圆形 ,点击该接口在右下角的设置中->Format->Stereotype Display->Label,即可切换到想要的样式 其他方式 在class diagram下,左侧有interface图标,先鼠标左键选择࿰…...
单片机之瑞萨RL78定时计数器
单片机之瑞萨RL78定时计数器 使用瑞萨RL78定时计数器的简单例程。这个例程使用定时器0来产生一个以秒为单位的定时器中断,并在中断服务程序中增加一个全局变量以跟踪中断的发生。 首先,我们需要了解RL78的定时器0是一个16位的定时器,它的时钟…...

手机号码格式校验:@Phone(自定义参数校验注解)
需求 新增接口 和 修改接口 中,手机号码的格式校验是普遍需要的。 在每个手机号码字段上添加正则表达式校验注解来实现校验,重复书写,容易出错;在不同的手机号码字段上,可能使用了不同的校验规则,无法有效…...

ORACLE Redo Log Buffer 重做日志缓冲区机制的设计
最近和朋友包括一些国产数据库的研发人员交流,很多程序员认为 Oracle 已经过时,开源数据库或者他们研发的国产数据库才代表数据库发展的未来。甚至在很多交流会议上拿出自家产品的某一个功能点和 Oracle 对比就觉得已经遥遥领先。 实际上数据库系统的发展…...

PWN Test_your_nc Write UP
目录 PWN 00 解题过程 总结归纳 PWN 01 解题过程 总结归纳 PWN 02 解题过程 总结归纳 PWN 03 解题过程 总结归纳 PWN 04 解题过程 总结归纳 CTF PWN 开始! 冲就完了 PWN 00 解题过程 ssh远程链连接 ssh ctfshowpwn.challenge.ctf.show -p28151 输…...

Centos7配置firewalld防火墙规则
这里写自定义目录标题 欢迎使用Markdown编辑器一、简单介绍二、特点和功能2.1、区域(Zone)2.2、运行时和永久配置2.3、服务和端口2.4、动态更新2.5、连接跟踪2.6、D-Bus接口 三、设置规则3.1、启动防火墙服务3.2、新建防火墙规则的服务,添加端…...

【新版】系统架构设计师 - 未来信息综合技术
个人总结,仅供参考,欢迎加好友一起讨论 文章目录 架构 - 未来信息综合技术考点摘要信息物理系统CPS的体系架构CPS 的技术体系CPS应用场景 人工智能分类关键技术机器学习 机器人发展分类机器人4.0 边缘计算概念与特点边云协同安全应用场景 数字孪生关键技…...
CAD二次开发LineSegment2d
在C#的CAD二次开发中,LineSegment2d 是AutoCAD的.NET API中的一个类,用于表示二维空间中的线段。它包含了起点和终点的坐标信息,并提供了一些方法用于进行线段之间的计算和判断。 LineSegment2d 类具有以下常用属性和方法: Star…...

Linux shell编程学习笔记5:变量命名规则、变量类型、使用变量时要注意的事项
跟其他的高级开发语言一样,Linux Shell编程中使用的数据也需要保存在变量中。 Shell使用变量来控制其行为,并且可以通过更改变量值来更改Shell和其他程序的行为。 我们先来了解一下变量命令的规则、变量类型和使用变量时要注意的事项。 一、变量命名规…...

如何把word的页眉页脚改为图片
前言 亲戚A: 听说你是计算机专业? 沐风晓月: 是啊 亲戚A: 那正好,来看看我这个页眉怎么改成图片 沐风晓月: 一万匹马奔腾而过 亲戚B: 听说你是英语专业? 沐风晓月: 是啊…...
spring6-实现简易版IOC容器
手写简易版IOC容器 1、回顾Java反射2、实现Spring的IoC 我们都知道,Spring框架的IOC是基于Java反射机制实现的,下面我们先回顾一下java反射。 1、回顾Java反射 Java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所…...
java_网络服务相关_gateway_nacos_feign区别联系
1. spring-cloud-starter-gateway 作用:作为微服务架构的网关,统一入口,处理所有外部请求。 核心能力: 路由转发(基于路径、服务名等)过滤器(鉴权、限流、日志、Header 处理)支持负…...

Prompt Tuning、P-Tuning、Prefix Tuning的区别
一、Prompt Tuning、P-Tuning、Prefix Tuning的区别 1. Prompt Tuning(提示调优) 核心思想:固定预训练模型参数,仅学习额外的连续提示向量(通常是嵌入层的一部分)。实现方式:在输入文本前添加可训练的连续向量(软提示),模型只更新这些提示参数。优势:参数量少(仅提…...

突破不可导策略的训练难题:零阶优化与强化学习的深度嵌合
强化学习(Reinforcement Learning, RL)是工业领域智能控制的重要方法。它的基本原理是将最优控制问题建模为马尔可夫决策过程,然后使用强化学习的Actor-Critic机制(中文译作“知行互动”机制),逐步迭代求解…...
QMC5883L的驱动
简介 本篇文章的代码已经上传到了github上面,开源代码 作为一个电子罗盘模块,我们可以通过I2C从中获取偏航角yaw,相对于六轴陀螺仪的yaw,qmc5883l几乎不会零飘并且成本较低。 参考资料 QMC5883L磁场传感器驱动 QMC5883L磁力计…...

华为OD机试-食堂供餐-二分法
import java.util.Arrays; import java.util.Scanner;public class DemoTest3 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseint a in.nextIn…...
工业自动化时代的精准装配革新:迁移科技3D视觉系统如何重塑机器人定位装配
AI3D视觉的工业赋能者 迁移科技成立于2017年,作为行业领先的3D工业相机及视觉系统供应商,累计完成数亿元融资。其核心技术覆盖硬件设计、算法优化及软件集成,通过稳定、易用、高回报的AI3D视觉系统,为汽车、新能源、金属制造等行…...
聊一聊接口测试的意义有哪些?
目录 一、隔离性 & 早期测试 二、保障系统集成质量 三、验证业务逻辑的核心层 四、提升测试效率与覆盖度 五、系统稳定性的守护者 六、驱动团队协作与契约管理 七、性能与扩展性的前置评估 八、持续交付的核心支撑 接口测试的意义可以从四个维度展开,首…...

【Oracle】分区表
个人主页:Guiat 归属专栏:Oracle 文章目录 1. 分区表基础概述1.1 分区表的概念与优势1.2 分区类型概览1.3 分区表的工作原理 2. 范围分区 (RANGE Partitioning)2.1 基础范围分区2.1.1 按日期范围分区2.1.2 按数值范围分区 2.2 间隔分区 (INTERVAL Partit…...

学习STC51单片机32(芯片为STC89C52RCRC)OLED显示屏2
每日一言 今天的每一份坚持,都是在为未来积攒底气。 案例:OLED显示一个A 这边观察到一个点,怎么雪花了就是都是乱七八糟的占满了屏幕。。 解释 : 如果代码里信号切换太快(比如 SDA 刚变,SCL 立刻变&#…...
稳定币的深度剖析与展望
一、引言 在当今数字化浪潮席卷全球的时代,加密货币作为一种新兴的金融现象,正以前所未有的速度改变着我们对传统货币和金融体系的认知。然而,加密货币市场的高度波动性却成为了其广泛应用和普及的一大障碍。在这样的背景下,稳定…...