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.mfbz.cn/a/595697.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

尊享面试100(272.最接近的二叉树搜索值|| python)

刚开始想着用最小堆&#xff0c;把每个元素都加进去&#xff0c;然后找出最小的k个值&#xff0c;复杂度应该是&#xff08;nklogn) import heapq as pq class Solution:def __init__(self):self.h []pq.heapify(self.h)def closestKValues(self, root: Optional[TreeNode], …

WINDOWS配置IIS

1.安装IIS 1.1.打开启用Windows功能 打开“控制面板” > “程序和功能” > “启用或关闭 Windows 功能”。 1.2.启用IIS功能 打开“控制面板” > “程序和功能” > “启用或关闭 Windows 功能”。 勾选“Internet Information Services”&#xff0c;然后点击“确定…

《21天学通C++》(第十一章)多态

为什么需要多态&#xff1f; 为了最大限度地减少代码&#xff0c;提高可读性 1.虚函数 虚函数是C中的一种特殊成员函数&#xff0c;它允许在派生类&#xff08;也称为子类&#xff09;中重写&#xff08;覆盖&#xff09;基类的实现&#xff0c;使用virtual进行声明 在C中&am…

【GameFi】链游 | Seraph | 区块链上的动作角色扮演 NFT 装备收集和掠夺游戏

官网下载 新赛季公告&#xff1a;https://www.seraph.game/#/news/357 开始时间&#xff1a;2024年4月19日 11:00 (UTC8&#xff09; discard会有人发送一些激活码&#xff0c;或者有一些活动&#xff0c;只需要填表格关注账号&#xff0c;参与了就会将激活码发到你的邮箱 …

Remix框架实现 SSR

SSR SSR是一种网页渲染方式&#xff0c;它与传统的客户端渲染&#xff08;CSR&#xff09;相对&#xff0c;在日常的项目中我们更多是使用 CSR 的方式进行前端分离开发&#xff0c;渲染会在浏览器端进行。然而在SSR中&#xff0c;当用户请求一个网页时&#xff0c;服务器将生成…

U盘提示“被写保护”无法操作处理怎么办?

今天在使用U盘复制拷贝文件时&#xff0c;U盘出现“U盘被写保护”提示&#xff0c;导致U盘明明有空闲内存却无法复制的情况。这种情况很常见&#xff0c;很多人在插入U盘到电脑后&#xff0c;会出现"U盘被写保护"的提示&#xff0c;导致无法进行删除、保存、复制等操…

一、Redis五种常用数据类型

Redis优势&#xff1a; 1、性能高—基于内存实现数据的存储 2、丰富的数据类型 5种常用&#xff0c;3种高级 3、原子—redis的所有单个操作都是原子性&#xff0c;即要么成功&#xff0c;要么失败。其多个操作也支持采用事务的方式实现原子性。 Redis特点&#xff1a; 1、支持…

vscode连接服务器的docker步骤

进入容器之后&#xff0c;操作方式与本地windows系统操作逻辑一样&#xff1b;容器内部结构都能任意查看和使用&#xff0c;创建文件及编写python脚本都可以直接使用vs code编辑器进行编辑和调试&#xff0c;从而避免使用命令行及vim编辑文件&#xff0c;非常直观且方便~

【精品毕设推荐】基于Javaee的影视创作论坛的设计与实现

点击下载原文及代码 摘 要 随着时代的发展&#xff0c;互联网的出现&#xff0c;给传统影视行业带来的最大便利就是&#xff0c;方便了影视从业人员以及爱好者的交流和互动&#xff0c;而为用户提供一个书写影评&#xff0c;阅读影评以及回复影评的平台&#xff0c;以影评为…

动态规划——斐波那契数列模型:91.解码方法

文章目录 题目描述算法原理1.状态表示2.状态转移方程3.初始化⽅法⼀&#xff08;直接初始化&#xff09;⽅法⼆&#xff08;添加辅助位置初始化&#xff09; 4.填表顺序5.返回值 代码实现C优化Java优化 题目描述 题目链接&#xff1a;91.解码方法 算法原理 类似于斐波那契…

制作外贸脚本的流程和代码分享!

在全球化的今天&#xff0c;外贸业务成为了许多企业拓展市场、增加收入的重要途径&#xff0c;而在外贸业务中&#xff0c;一个优秀的脚本往往能够起到事半功倍的效果。 那么&#xff0c;如何制作一个高效、专业的外贸脚本呢?本文将为您详细解析制作外贸脚本的流程&#xff0…

苹果11手机开不了机怎么办?四大原因及解决方法总结!

苹果手机以其流畅的操作系统和出色的性能出名&#xff0c;但终究只是一部手机&#xff0c;黑屏、死机等问题还是有可能会出现的。 那么&#xff0c;苹果手机为什么莫名其妙黑屏开不了机呢&#xff1f;苹果11手机开不了机怎么办&#xff1f;小编为大家总结了4个可能原因&#x…

国产最强多模态大模型Step Fun-1V,究竟有多好用?

前言&#xff1a; 2023年是大模型的元年&#xff0c;随着ChatGPT的爆火&#xff0c;将大模型带入了公众的视野 &#xff0c;国内也随之掀起了百模大战的浪潮。在这股浪潮的推动下&#xff0c;诸多科技公司&#xff0c;乃至大厂都争相推出自己的大模型产品&#xff0c;希望能够…

【打赏收款收银台多合一支付收款HTML源码】

打赏收款收银台多合一支付收款HTML源码 效果图部分源码领取源码下期更新预报 效果图 部分源码 <!DOCTYPE HTML> <html> <head> <title>打赏台</title> <meta name"keywords" content"收银台,个人收款二维码,支付宝在线收款,微…

【C语言】高质量选择题

目录 题目一&#xff1a; 题目二&#xff1a; 题目三&#xff1a; 题目四&#xff1a; 题目五&#xff1a; 题目六&#xff1a; 题目七&#xff1a; 题目八&#xff1a; 题目九&#xff1a; 题目十&#xff1a; 题目十一&#xff1a; 题目十二&#xff1a; 题目十…

方法的入栈和出栈

一.作用域问题 1.全局作用域 在全局都能进行访问的变量 var a 10;function fn() {var b 20;return a b;}console.log(fn()); 2.局部的作用域 只能在限定的范围内进行访问 function fn() {var b 20;}console.log(b); b is not defined 打印的结果是b这个变量没用定义 3…

[JUCE库]关于JUCE如何生成动态链接库 juce-7.0.1-windows

前言 当我们在使用JUCE库的时候&#xff0c;可能会需要使用到静态链接的方式&#xff0c;还好的一点是JUCE本身提供了CMake编译&#xff0c;也提供了单独的sln编译。 本文章仅针对juce-7.0.1-windows&#xff0c;由于不同版本之间差异较大&#xff0c;可能不能通用&#xff0…

Unity数据持久化之XML

目录 数据持久化XML概述XML文件格式XML基本语法XML属性 C#读取存储XMLXML文件存放位置C#读取XML文件C#存储XML文件 实践小项目必备知识点XML序列化&#xff08;不支持字典&#xff09;XML反序列化IXmlSerializable接口让Dictionary支持序列化反序列化 数据持久化XML概述 什么是…

redis进阶--IDEA环境

目录 一、解决redis服务器端口问题 二、java环境下使用redis 三、javaSpringt环境下使用redis 四、redis持久化 1、持久化概念 2、redis持久化策略 3、RDB策略 4、AOF策略 5、混合持久化策略 五、redis事务 1、数据库事务 2、redis事务特点 3、redis事务的作用 4…

jquery项目 html使用export import方式调用模块

jquery的老项目&#xff0c;引入vue3, 需要方便使用export, import方式引用一些常用的方法与常量 导出模块 export js/numberUtil.js /*** Description:* Author Lani* date 2024/1/10*//* * 【金额】 保留2位小数&#xff0c;不四舍五入 * 5.992550 >5.99 , 2 > 2.…
最新文章