C++顺序容器3——容器适配器

容器适配器

除了顺序容器外,标准库还定义了三个顺序容器适配器:stack、queue和priority_queue。

适配器(adaptor)是标准库中的一个通用概念。容器、迭代器和函数都有适配器。

本质上,一个适配器是一种机制,能使某种事物的行为看起来像另外一种事物一样。一个容器适配器接受一种已有的容器类型,使其行为看起来像一种不同的类型。例如,stack适配器接受一个顺序容器(除array或forward_list外),并使其操作起来像一个stack一样。

所有容器适配器都支持的操作和类型
size_type一种类型,足以保存当前类型的最大对象的大小
value_type元素类型
container_type实现适配器的底层容器类型
A a;创建一个名为a的空适配器
A a(c);创建一个名为a的适配器,带有容器c的一个拷贝
关系运算符每个适配器都支持所有关系运算符:==、!=、<、<=、>和>
这些运算符返回底层容器的比较结果
a.empty()若a包含任何元素,返回false,否则返回true
a.size()返回a中的元素数目

swap(a,b)

a.swap(b)

交换a和b的内容,a和b必须有相同类型,包括底层容器类型也必须相同


定义一个适配器

每个适配器都定义两个构造函数:默认构造函数创建一个空对象,接受一个容器的构造函数拷贝该容器来初始化适配器。

例如,假定deg 是一个deque<int>,我们可以用deg 来初始化一个新的stack,如下所示:

stack<int> stk(deq);//从deq拷贝元素到stk

默认情况下,stack和queue是基于deque实现的,priority_queue是在vector之上实现的。

我们可以在创建一个适配器时将一个命名的顺序容器作为第二个类型参数,来重载默认容器类型。

// 在vector上实现的空栈
stack<string, vector<string>> str_stk;//str_stk2在vector上实现,初始化时保存svec的拷贝
stack<string, vector<string>> str_stk2(svec);

对于一个给定的适配器,可以使用哪些容器是有限制的。

  1. 所有适配器都要求容器具有添加和删除元素的能力。因此,适配器不能构造在array之上。
  2. 类似的,我们也不能用forward_list 来构造适配器,因为所有适配器都要求容器具有添加、删除以及访问尾元素的能力。
  3. stack只要求push_back、pop_back和back操作,因此可以使用除array和forward_list 之外的任何容器类型来构造 stack.
  4. queue 适配器要求back、push back、front和push_front,因此它可以构造于list或deque之上,但不能基于vector构造。
  5. priority_queue除了front、push_back和pop_back操作之外还要求随机访问能力,因此它可以构造于vector或 deque之上,但不能基于list构造。

栈适配器

stack类型定义在stack头文件中。表列出了stack所支持的操作。

下面的程序展示了如何使用stack:

stack<int> intStack;//空栈// 填满栈
for (size t ix = 0; ix != 10; ++ix)
intStack.push(ix);//intstack保存0到9十个数
while(!intStack.empty()){//intStack中有值就继续循环int value = intStack.top();
//使用栈顶值的代码intStack.pop();//弹出栈顶元素,继续循环
}

其中,声明语句

stack<int>intStack;//空栈

定义了一个保存整型元素的栈intStack,初始时为空。for 循环将 10个元素添加到栈中,这些元素被初始化为从0开始连续的整数。while循环遍历整个stack,获取top值,将其从栈中弹出,直至栈空。

未列出的栈操作

s.pop()删除栈顶元素,但不返回该元素值

s.push(item)

s.emplace (args)

创建一个新元素压入栈顶,该元素通过拷贝或移动item而来,或者由args构造
s.top()返回栈顶元素,但不将元素弹出栈

栈默认基于deque实现,也可以在list或vector之上实现。

每个容器适配器都基于底层容器类型的操作定义了自己的特殊操作。我们只可以使用适配器操作,而不能使用底层容器类型的操作。

例如,

intStack.push(ix);// intStack保存0到9十个数

此语句试图在intstack的底层deque 对象上调用 push_back。虽然 stack 是基于deque 实现的,但我们不能直接使用deque操作。

不能在一个stack上调用push_back,而必须使用stack自己的操作——push。

队列适配器

queue和priority_queue 适配器定义在queue头文件中。表列出了它们所支持的操作。

未列出的queue和priority_queue 操作

q.pop()返回 queue的首元素或priority_queue的最高优先级的元素,但不删除此元素
q.front()返回首元素或尾元素,但不删除此元素
q.back()只适用于queue
q.top()返回最高优先级元素,但不删除该元素,只适用于priority_queue

q.push(item)

q.emplace (args)

在queue 末尾或priority_queue 中恰当的位置创建一个元素,其值为item,或者由args 构造

queue 默认基于deque实现,priority_queue默认基于vector实现;
queue也可以用list或vector实现,priority_queue也可以用deque实现。

标准库queue 使用一种先进先出(first-in,first-out,FIFO)的存储和访问策略。进入队列的对象被放置到队尾,而离开队列的对象则从队首删除。饭店按客人到达的顺序来为他们安排座位,就是一个先进先出队列的例子。

priority_queue 允许我们为队列中的元素建立优先级。新加入的元素会排在所有优先级比它低的已有元素之前。饭店按照客人预定时间而不是到来时间的早晚来为他们安排座位,就是一个优先队列的例子。默认情况下,标准库在元素类型上使用<运算符来确定相对优先级。

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

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

相关文章

C++11 右值与移动语义

前言&#xff1a; 我们首先汇总一下在C11中新的变化&#xff1a; 1、新容器 —— unodered_xxx 2、新接口 cbegin等&#xff0c;无关痛痒initializer_list系列的构造push_xxx / insert / emplace 等增加右值引用插入版本&#xff0c;意义重大&#xff0c;提高效率容器新增移…

领域驱动设计(DDD)笔记(一)基本概念

文章链接 领域驱动设计&#xff08;DDD&#xff09;笔记&#xff08;一&#xff09;基本概念-CSDN博客领域驱动设计&#xff08;DDD&#xff09;笔记&#xff08;二&#xff09;代码组织原则-CSDN博客 DDD基本概念 DDD 是一种面向复杂需求的软件设计方法&#xff0c;将软件开…

【Vue3】openlayers加载瓦片地图并手动标记坐标点

目录 一、创建Vue3项目 二、openlayers加载瓦片地图&#xff08;引js文件版&#xff09; 2.1 将以下的文件复制到public下 2.2 index.html引入ol脚本 2.3 删除项目自带的HelloWorld.vue&#xff0c;创建Map.vue 2.4 编码Map.vue 2.5 修改App.vue 2.6 启动项目测试 三、…

通信光缆主要敷设方式有哪些(续)

在《通信光缆主要敷设方式有哪些》一文中&#xff0c;介绍了光缆的直埋、架空和管道敷设方式。此外&#xff0c;根据敷设场景的不同&#xff0c;光缆的常见敷设方式还包括&#xff1a;高铁槽道内敷设、水底敷设、墙壁敷设、引上、室内敷设等。 1 高铁槽道内光缆敷设 光缆顺沿高…

vscode设置免密登录远程服务器

文章目录 1. 问题描述2. 解决方案3. 原理 1. 问题描述 当我们使用vscode的ssh连接远程服务器后&#xff0c;过一段时间后&#xff0c;总是要求登录服务器的密码。 这就导致一个麻烦就是: 无论是在公司还是在学校&#xff0c;密码往往不是自己设置的&#xff0c;所以记忆起来就…

Python反射

1、何为反射 1.1、概念 反射&#xff08;Reflection&#xff09;是计算机科学中的一个术语&#xff0c;指的是一种在运行时动态地获取、操作和修改一个语言的特定对象的能力。在编程中&#xff0c;反射可以让程序在运行时动态地获取类的信息&#xff0c;包括类的属性、方法和…

《QT实用小工具·五十二》文本或窗口炫酷有趣的滚动条——果冻条

1、概述 源码放在文章末尾 该项目实现了文本或窗口纤细的滚动条——果冻条 一个可以像弓弦一样拉出来&#xff0c;并且来回弹动的普通滚动条。 思路为此&#xff0c;但发现实际效果更像条状果冻&#xff0c;并且略有谐音&#xff0c; 故&#xff0c;称之为——“果冻条”&am…

【QT学习】12.UDP协议,广播,组播

一。Udp详细解释 UDP&#xff08;User Datagram Protocol&#xff09;是一种无连接的传输层协议&#xff0c;它提供了一种简单的、不可靠的数据传输服务。与TCP相比&#xff0c;UDP不提供可靠性、流量控制、拥塞控制和错误恢复等功能&#xff0c;但由于其简单性和低开销&#x…

【Linux-点灯烧录-SD卡/USB烧写】

目录 1. 烧写方式2. 烧写之代码编译2.1 led.s->led.o2.2 led.o->led.elf2.3 led.elf->led.bin2.4 反汇编&#xff1a;led.elf->led.dis 3. 烧写之烧录到SD卡上&#xff1a;3.1 开启烧录软件权限&#xff1a;3.2 确定SD卡的格式&#xff1a;FAT323.3 烧录到SD卡上3.…

【蓝桥杯】基于STM32G431模块总结

目录 一.LED部分 二.按键部分 三.ADC部分 四.基于IIC的24c02读写部分&#xff08;EEPROM&#xff09; 五.LCD显示部分 六.定时器部分 1.定时器中断回调 2. PWM输出改变频率和占空比 3.输入捕获测量占空比和频率(利用主从模式) 4.方波输出回调 七.RTC部分 一.LED部分 …

【Vue3源码学习】— CH3.3 renderer.ts详解

renderer.ts详解 1.概念理解1.1 主要功能1.2 核心函数1.3 流程说明1.4 学习 render.ts2.createRenderer2.1 源码解析2.2 代码解释2.2.1 泛型参数2.2.2 函数参数2.3 使用示例2.4 总结1.概念理解 1.1 主要功能 功能描述渲染和更新 DOM渲染器的核心职责是将 VNode 树转换成 DOM 树…

学习Rust的第22天:mini_grep第2部分

书接上文&#xff0c;在本文中&#xff0c;我们学习了如何通过将 Rust 程序的逻辑移至单独的库箱中并采用测试驱动开发 (TDD) 实践来重构 Rust 程序。通过在实现功能之前编写测试&#xff0c;我们确保了代码的可靠性。我们涵盖了基本的 Rust 概念&#xff0c;例如错误处理、环境…

ChatGPT理论分析

ChatGPT "ChatGPT"是一个基于GPT&#xff08;Generative Pre-trained Transformer&#xff09;架构的对话系统。GPT 是一个由OpenAI 开发的自然语言处理&#xff08;NLP&#xff09;模型&#xff0c;它使用深度学习来生成文本。以下是对ChatGPT进行理论分析的几个主…

移动机器人系统与技术:自动驾驶、移动机器人、旋翼无人机

这本书全面介绍了机器人车辆的技术。它介绍了道路上自动驾驶汽车所需的概念。此外&#xff0c;读者可以在六足机器人的构造、编程和控制方面获得宝贵的知识。 这本书还介绍了几种不同类型旋翼无人机的控制器和空气动力学。它包括各种旋翼推进飞行器在不同空气动力学环境下的模…

基于vmware虚拟机中yum源的配置

1.首先需确保虚拟机中已经连接了光盘映像&#xff08;如图在虚拟机右下方从左往右第二个&#xff09; 2.在虚拟机中找到光盘映像文件&#xff08;默认在/dev的sr0&#xff09; 3.将光盘文件挂载&#xff08;挂载后才可读取&#xff09; 为方便每一次开机之后自动挂载&#xff…

学浪视频怎么下载保存到本地

你是否曾经因为想要保存一份珍贵的学浪视频却苦于无法下载而感到烦恼&#xff1f;现在&#xff0c;我将向你揭示一个简单易行的方法&#xff0c;让你轻松地将学浪视频保存到本地&#xff0c;随时随地享受学习的乐趣。你是否曾经因为想要保存一份珍贵的学浪视频却苦于无法下载而…

未来科技的前沿:深入探讨人工智能的进展、机器学习技术和未来趋势

文章目录 一、人工智能的定义和概述1. 人工智能的基本概念2. 人工智能的发展历史 二、技术深入&#xff1a;机器学习、深度学习和神经网络1. 机器学习2. 深度学习3. 神经网络 三、人工智能的主要目标和功能1. 自动化和效率提升2. 决策支持和风险管理3. 个性化服务和预测未来 本…

初始数据类型

注释补充 在我们编写任何代码的时候&#xff0c;都有一个叫做注释的功能 在golang中有两种 单行注释 // 如下图所示 加入了注释的话&#xff0c;代码在执行的时候会自动忽视这段内容 //fmt.Println("天上") //fmt.Println("天下") //fmt.Println("唯…

MySQL商城数据库88张表结构(46—50)

46、消息队列表 CREATE TABLE dingchengyu消息队列表 (id int(11) NOT NULL AUTO_INCREMENT COMMENT 序号,userId int(11) DEFAULT NULL COMMENT 用户id,msgTtype tinyint(4) DEFAULT 0 COMMENT 消息类型,createTime datetime DEFAULT NULL COMMENT 创建时间,sendTime datetim…

本地基于知识库的大模型的使用教程

本地基于知识库的大模型的使用教程 启动 双击 大模型启动.bat文件&#xff0c;内容如下&#xff1a; cmd /k "cd /d G:\Anaconda3\Scripts && activate.bat && cd /d D:\docdb_llm && conda activate python3.11 && python startup.py…