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

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)来实现栈的功能。容器适配器是一种在标准容器之上提供额外接口或修改现有接口的抽象层。

让我们看看为什么这个类可以被看作是一个容器适配器:

  1. 使用模板参数 Container:通过使用模板参数 Container,这个栈类允许用户选择不同的容器类型来存储数据。用户可以传入任何符合栈要求的容器,例如 std::vectorstd::deque、或者其他符合要求的容器类型。

  2. 封装容器操作:该栈类封装了底层容器的操作,如 push_backpop_backback 等,通过公共接口提供对这些操作的访问。这使得用户可以使用栈的接口而不必直接与底层容器进行交互。

  3. 提供栈的特定接口:栈有其自己的特定接口,如 pushpoptopemptysize。这些接口反映了栈的行为,而底层容器的细节被封装在栈类内部。

因此,尽管 stack 类使用了一个已有的容器,但它提供了栈的抽象接口,允许用户通过栈的方式使用底层容器。这种通过封装和提供特定接口的方式,使得栈类成为容器适配器。

deque

deque(双端队列)是C++标准库中的一种容器,它是一种双向开口的连续线性空间,可以在头部和尾部进行快速的插入和删除操作。deque是"double-ended queue"的缩写,它允许在队列的两端执行高效的操作。

以下是deque的一些特点和解释:

  1. 双向开口:deque允许在头部和尾部进行元素的插入和删除操作,而且这些操作都是高效的,不会像vector那样需要移动大量元素。

  2. 连续线性空间:deque内部通常由多个连续的缓冲区组成,这些缓冲区会动态分配和管理,以保持高效的操作。这种设计使得deque可以在内部分段存储数据,而不需要像vector那样连续存储。

  3. 随机访问:deque支持随机访问,就像数组一样,可以通过索引来访问元素,而且访问操作的时间复杂度是常数时间。

  4. 动态增长:deque可以动态增长,当需要存储更多元素时,会自动分配新的缓冲区,并将元素复制到新的缓冲区中。

  5. 插入和删除效率高:由于deque的双向开口特性,插入和删除元素的效率非常高,不仅仅限于队列的末尾,还可以在队列的前端进行操作。

总之,deque是一种非常灵活和高效的数据结构,适用于需要频繁在队列两端进行操作的情况。它是STL(标准模板库)中的一个重要组件,可以用来解决各种问题,包括队列、栈、双端队列等。
deque(双端队列)不仅可以对队头和队尾的元素进行操作,还可以对队列中间的元素进行操作。这是deque与其他容器(如vector)的主要不同之处。

deque支持以下操作:

  1. 头部插入和删除:你可以在deque的头部插入元素,也可以从头部删除元素,这些操作是高效的。

  2. 尾部插入和删除:类似地,你可以在deque的尾部插入元素,也可以从尾部删除元素,这也是高效的。

  3. 中间插入和删除: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> >
  1. template<...>: 这是模板的声明,表明接下来定义的是一个模板类或模板函数。

  2. class T: 这里定义了一个模板参数 T,表示该模板类将接受一个类型参数。T 是用户在使用该模板类时需要提供的类型。

  3. 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 //创建一个命名空间&#xff0c;避免和库里的冲突 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&#xff0c;PATH不太明白&#xff0c;翻了翻规范&#xff0c;在这里记个笔记。下面的叙述可能是中英混合&#xff0c;有一些是规范中的原文我直接搬过来的。我翻译的不准确。 Segment PATH是CIP Segment中的一个分类。要了解PATH…...

使用lombok进行bulider之后调取HashMap的自定义方法进行对象操作报空指针异常(pojo也适用)

概论 这主要的问题就是bulider的特性的问题&#xff0c;就是他只能给你搭建了一个脚手架&#xff0c;里面的东西其实他没动你的&#xff0c;你得自己去给他实体化&#xff0c;如果你使用了类似HashMap等集合的话&#xff0c;你得自己去bulid一个在那个里面作为初始化对象你才可…...

矩阵-day14

...

上古神器:十六位应用程序 Debug 的基本使用

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

[学习笔记]ARXML - Data Format

参考AUTOSAR文档&#xff1a; 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编码&#xff…...

Go_原子操作和锁

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

初识Java 12-1 流

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

【软件工程_UML—StartUML作图工具】startUML怎么画interface接口

StartUML作图工具怎么画interface接口 初试为圆形 &#xff0c;点击该接口在右下角的设置中->Format->Stereotype Display->Label&#xff0c;即可切换到想要的样式 其他方式 在class diagram下&#xff0c;左侧有interface图标&#xff0c;先鼠标左键选择&#xff0…...

单片机之瑞萨RL78定时计数器

单片机之瑞萨RL78定时计数器 使用瑞萨RL78定时计数器的简单例程。这个例程使用定时器0来产生一个以秒为单位的定时器中断&#xff0c;并在中断服务程序中增加一个全局变量以跟踪中断的发生。 首先&#xff0c;我们需要了解RL78的定时器0是一个16位的定时器&#xff0c;它的时钟…...

手机号码格式校验:@Phone(自定义参数校验注解)

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

ORACLE Redo Log Buffer 重做日志缓冲区机制的设计

最近和朋友包括一些国产数据库的研发人员交流&#xff0c;很多程序员认为 Oracle 已经过时&#xff0c;开源数据库或者他们研发的国产数据库才代表数据库发展的未来。甚至在很多交流会议上拿出自家产品的某一个功能点和 Oracle 对比就觉得已经遥遥领先。 实际上数据库系统的发展…...

PWN Test_your_nc Write UP

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

Centos7配置firewalld防火墙规则

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

【新版】系统架构设计师 - 未来信息综合技术

个人总结&#xff0c;仅供参考&#xff0c;欢迎加好友一起讨论 文章目录 架构 - 未来信息综合技术考点摘要信息物理系统CPS的体系架构CPS 的技术体系CPS应用场景 人工智能分类关键技术机器学习 机器人发展分类机器人4.0 边缘计算概念与特点边云协同安全应用场景 数字孪生关键技…...

CAD二次开发LineSegment2d

在C#的CAD二次开发中&#xff0c;LineSegment2d 是AutoCAD的.NET API中的一个类&#xff0c;用于表示二维空间中的线段。它包含了起点和终点的坐标信息&#xff0c;并提供了一些方法用于进行线段之间的计算和判断。 LineSegment2d 类具有以下常用属性和方法&#xff1a; Star…...

Linux shell编程学习笔记5:变量命名规则、变量类型、使用变量时要注意的事项

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

如何把word的页眉页脚改为图片

前言 亲戚A&#xff1a; 听说你是计算机专业&#xff1f; 沐风晓月&#xff1a; 是啊 亲戚A&#xff1a; 那正好&#xff0c;来看看我这个页眉怎么改成图片 沐风晓月&#xff1a; 一万匹马奔腾而过 亲戚B&#xff1a; 听说你是英语专业&#xff1f; 沐风晓月&#xff1a; 是啊…...

spring6-实现简易版IOC容器

手写简易版IOC容器 1、回顾Java反射2、实现Spring的IoC 我们都知道&#xff0c;Spring框架的IOC是基于Java反射机制实现的&#xff0c;下面我们先回顾一下java反射。 1、回顾Java反射 Java反射机制是在运行状态中&#xff0c;对于任意一个类&#xff0c;都能够知道这个类的所…...

Python 装饰器实战:用@syntax 优雅地增强函数功能

# Python 装饰器实战&#xff1a;用syntax 优雅地增强函数功能## 什么是装饰器&#xff1f;装饰器&#xff08;Decorator&#xff09;是 Python 中的一种高级特性&#xff0c;它允许你在不修改原函数代码的情况下&#xff0c;动态地给函数添加功能。简单来说&#xff0c;装饰器…...

车辆信号震动信号的滤波、幅值与能量分析——基于测试台采集文件ssjlbpp.m等的研究

车辆信号的震动信号的滤波、幅值以及能量分析&#xff0c;信号是利用测试台采集回来的 文件列表&#xff1a; ssjlbpp.m cxssjlbpp.m ssj.m fuzhissj.m翻了翻硬盘里压箱底的车辆测试台数据&#xff0c;哦对&#xff0c;还有那堆当时随手起的.mat之外的.m文件&#xff1a;ssjlbp…...

最大数(信息学奥赛一本通- P1549)(洛谷-P1198)

【题目描述】原题来自&#xff1a;JSOI 2008给定一个正整数数列 a1,a2,a3,⋯,an &#xff0c;每一个数都在 0∼p–1 之间。可以对这列数进行两种操作&#xff1a;添加操作&#xff1a;向序列后添加一个数&#xff0c;序列长度变成 n1&#xff1b;询问操作&#xff1a;询问这个序…...

智慧交通落地难题:为什么80%的智能信号灯项目效果不达预期?

智慧交通落地困境&#xff1a;从技术神话到现实瓶颈的深度解构 清晨7点30分&#xff0c;北京东三环的某个十字路口&#xff0c;20名交警正在手动调节信号灯——这个造价480万元的智能信号系统在早高峰时段被完全弃用。类似的场景正在全国至少17个城市重复上演&#xff0c;某头部…...

为什么流水线ADC能用Dither,而SAR ADC效果差?深入解析两种架构下的Dither技术差异与改进方案

流水线ADC与SAR ADC中Dither技术的差异化设计与工程实践 在高速高精度数据采集系统中&#xff0c;量化噪声的非线性特性始终是困扰设计者的核心难题。当我们用频谱分析仪观察一个理想正弦波经过ADC转换后的输出时&#xff0c;那些突兀的谐波分量往往源自量化过程的非线性失真。…...

智能提取视频转文档:自动化工具提升内容处理效率

智能提取视频转文档&#xff1a;自动化工具提升内容处理效率 【免费下载链接】extract-video-ppt extract the ppt in the video 项目地址: https://gitcode.com/gh_mirrors/ex/extract-video-ppt 在数字化学习与办公场景中&#xff0c;视频内容提取已成为知识管理的重要…...

OpenClaw极简部署:nanobot镜像+手机Termux方案

OpenClaw极简部署&#xff1a;nanobot镜像手机Termux方案 1. 为什么要在手机上部署OpenClaw&#xff1f; 去年夏天&#xff0c;我在咖啡馆等朋友时突发奇想&#xff1a;如果能用手机随时调用AI助手处理文件该多好。当时尝试了几款云端AI工具&#xff0c;但要么功能受限&#…...

小白友好!FunASR语音识别镜像部署教程,开箱即用

小白友好&#xff01;FunASR语音识别镜像部署教程&#xff0c;开箱即用 1. 快速了解FunASR语音识别 FunASR是由阿里云推出的开源语音识别工具包&#xff0c;它就像是一个能听懂人说话的智能助手。想象一下&#xff0c;你对着手机说话&#xff0c;它能立刻把你说的话变成文字—…...

百川2-13B量化模型+OpenClaw:3种低成本个人AI助手应用方案

百川2-13B量化模型OpenClaw&#xff1a;3种低成本个人AI助手应用方案 1. 为什么选择量化模型OpenClaw组合 去年冬天&#xff0c;当我第一次尝试在本地部署大模型时&#xff0c;被显存不足的报错狠狠教育了一顿——我的RTX 3060显卡根本无法承载常规13B参数的模型。直到发现百…...

LVGL字体扩展避坑指南:freetype缓存管理导致的内存泄漏问题排查实录

LVGL字体扩展深度解析&#xff1a;如何规避freetype缓存管理中的内存泄漏陷阱 在嵌入式GUI开发中&#xff0c;LVGL结合freetype的动态字体加载功能为多语言支持提供了强大支持&#xff0c;但这也带来了内存管理的复杂性。本文将深入探讨一个典型场景&#xff1a;当项目需要频繁…...