【STL】顺序容器与容器适配器

文章目录

  • 1顺序容器概述
    • 1.1array
    • 1.2forward_list
    • 1.3deque
  • 2.如何确定使用哪种顺序容器呢?
  • 3.容器适配器的概念
  • 4.如何定义适配器呢?

1顺序容器概述

给出以下顺序容器表:

顺序容器类型作用
vector可变大小的数组,支持快速访问,除尾元素的插入或者删除很慢
string与vector相似,只不过专门用来存字符
list双向链表。只能双向顺序访问,插入删除的效率都很高
forward_list单向链表。只能单向顺序访问,插入删除的效率都很高
deque双端队列 。 支持快速随机访问。在头尾位置插入删除很快,中间则很慢
array固定大小的数组。支持快速随机访问。不能删除和添加元素

由于前面已经对vector、string、list有了较为详细的讲解,下面只介绍部分容器:

1.1array

除了array之外,其他容器都支持灵活的内存管理方式。根据实际情况可以自由调节容器的容量大小。这使得array的引用场景受到了限制。因为一旦初始化了array的大小,后面就不能在被改变了。
虽然看起来array的限制很多,但是array也因此变得更加安全,也更容易使用
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

1.2forward_list

forward_list和array都是新C++标准增加的类型。forward_list的设计目标是达到与最好的手写的单向链表数据结构相当的性能。因此,forward_list没有size操作,因为保存或者计算其大小就会比手写链表多出时间或者空间上面的开销。

值得注意的是,由于forward_list是单向链表,也就不具备反向遍历的功能,也就没有反向迭代器。相比于list,其删除节点的操作也会稍微复杂一些。
在这里插入图片描述

在这里插入图片描述

1.3deque

deque是一个更为复杂的数据结构。与string和vecotr类似,deque支持快速的随机访问,在中间位置添加或者删除元素的代价可能很高。当时与string和vector不同的是,deque首尾插入或者删除的效率很高,这一点相当于list或者forward_list。我们可以把deque看成是首插元素高效的vector

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

2.如何确定使用哪种顺序容器呢?

以下是选择使用顺序容器的参考:
1.如果没有其他的理由,那就优先考虑vector
2.如果你的程序有很多的小元素,且不想要产生额外的空间开销,那就不要用list和forward_list.
3.要支持快速随机访问,用array或者vector。
4.如果程序要求频繁的在容器中间插入或者删除元素,那就使用list或者forward_list.
5.如果程序要求在首尾插入或者删除元素,但是不在中间插入删除元素,那就选择deque。
6.如果只是在读取输入的时候需要在中间插入元素,可以考虑读取时用list或者forward_list,之后再拷贝到vector容器中。

3.容器适配器的概念

除了顺序容器外,标准库还定义了三个顺序容器适配器:stack、queue和priority_queue。适配器是标准库中的一个概念,容器、迭代器、函数都有适配器。适配器可以使某种事物的行为看起来像是另外一回事。一个容器适配器用一个已有的容器类型,使其行为看上去像一种不同的类型。例如,stack适配器可以接受vector类型,在vector的基础上重新定义其成员函数,使得整体看上去是一个stack。有点借鸡生蛋的意思。所有的适配器都要有添加删除以及访问尾元素的能力

不同的适配器可以接受的容器类型会有区别。例如stack需要有直接访问尾元素的能力,就不能构造于forward_list之上。queue要求弹出首元素,就不能构造于vector之上。priority_queue要求随机访问的能力,就不能构造于list和forward_list之上。

4.如何定义适配器呢?

每一个适配器都应该要有两个构造函数:默认构造创建一个空对象。接受一个容器的构造函数拷贝该容器来初始化适配器。
在这里插入图片描述
stack和queue默认是用deque实现的,priority_queue默认用vector实现的。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

我们可以显示的指定适配器用什么类型的容器去构建

	stack<int> st1;//用deque构建stack<int,vector<int>> st2;//用vecor<int> 构建stack<string, vector<string>>s3;//用string构建

其它适配器的的用法也跟上面类似。

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

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

相关文章

蓝桥杯 H整数删除

蓝桥杯 H整数删除 尝试代码未果&#xff1a;希望有题感之后能按照这个思路AC #include<algorithm> #include<iostream> #include<cstring> #include<queue> #include<cmath>using namespace std;int n,k; int a[10010]; int h[2],e[10010],ne[1…

JavaScript - 你能说出解决跨域的一些方案吗

难度级别:中高级及以上 提问概率:65% 回答解决跨域之前,首先建议求职者描述什么是跨域。跨域问题是浏览器基于同源策略引起的,同源策略是浏览器的一种安全功能。同源要保证域名相同,或是被访问服务的协议+主机+端口都相同,那么反之这些属…

PostgreSQL入门到实战-第四弹

PostgreSQL入门到实战 PostgreSQL查询语句(一)官网地址PostgreSQL概述查询语句概述查询语句实操更新计划 PostgreSQL查询语句(一) 官网地址 声明: 由于操作系统, 版本更新等原因, 文章所列内容不一定100%复现, 还要以官方信息为准 https://www.postgresql.org/PostgreSQL概述…

HarmonyOS 应用开发-使用colorPicker实现背景跟随主题颜色转换

介绍 本示例介绍使用image库以及effectKit库中的colorPicker对目标图片进行取色&#xff0c;将获取的颜色作为背景渐变色&#xff0c;通过swiper组件对图片进行轮播&#xff0c; 效果图预览 使用说明 直接进入页面&#xff0c;对图片进行左右滑动&#xff0c;或者等待几秒&a…

SpringBoot整合MyBatis四种常用的分页方式

目录 方式1 一、准备工作 1. 创建表结构 2. 导入表数据 3. 导入pom.xml依赖 4. 配置application.yml文件 5. 创建公用的实体类 项目结构 2. 创建controller层 3. 创建service层 4. 创建mapper层 5. 创建xml文件 6. 使用postman进行测试&#xff0c;测试结果如下…

深入探索力扣第12题:整数转罗马数字的算法之旅

力扣&#xff08;LeetCode&#xff09;第12题“整数转罗马数字”提供了一个绝佳的学习机会&#xff0c;不仅让我们深入古罗马的数字系统&#xff0c;也锻炼了我们的编程技巧。一起看看其背后的逻辑。 罗马数字基础 罗马数字是一种古老的数字表示方法&#xff0c;广泛用于古罗…

YOLOv9改进策略 :小目标 | 新颖的多尺度前馈网络(MSFN) | 2024年4月最新成果

💡💡💡本文独家改进:多尺度前馈网络(MSFN),通过提取不同尺度的特征来增强特征提取能力,2024年最新的改进思路 💡💡💡创新点:多尺度前馈网络创新十足,抢先使用 💡💡💡如何跟YOLOv8结合:1)放在backbone后增强对全局和局部特征的提取能力;2)放在detect…

尚硅谷html5+css3(1)html相关知识

1.基本标签&#xff1a; <h1>最大的标题字号 <h2>二号标题字号 <p>换行 2.根标签<html> 包括<head>和<body> <html><head><title>title</title><body>body</body></head> </html> 3…

SpringBoot学习之Kibana下载安装和启动(Mac版)(三十二)

一、简介 Kibana是一个开源的分析与可视化平台,设计出来用于和Elasticsearch一起使用的。你可以用kibana搜索、查看存放在Elasticsearch中的数据。Kibana与Elasticsearch的交互方式是各种不同的图表、表格、地图等,直观的展示数据,从而达到高级的数据分析与可视化的目的。 …

C语言单链表

1. 单链表的概念和结构 概念&#xff1a;链表是一种物理存储结构上非连续、非顺序的存储结构&#xff0c;数据元素的逻辑顺序是通过链表 中的指针链接次序实现的 。 链表与顺序表都属于线性表&#xff0c;顺序表在物理存储结构上是线性的&#xff0c;但是链表在物理存储结构上…

P1123 取数游戏(dfs算法)

题目描述 一个 NM 的由非负整数构成的数字矩阵&#xff0c;你需要在其中取出若干个数字&#xff0c;使得取出的任意两个数字不相邻&#xff08;若一个数字在另外一个数字相邻 8个格子中的一个即认为这两个数字相邻&#xff09;&#xff0c;求取出数字和最大是多少。 输入格式 第…

蝙蝠优化算法(bat optimization algorithm)

注意&#xff1a;本文引用自专业人工智能社区Venus AI 更多AI知识请参考原站 &#xff08;[www.aideeplearning.cn]&#xff09; 算法背景 蝙蝠优化算法&#xff08;Bat Algorithm&#xff09;是一种基于群体智能的优化算法&#xff0c;它的灵感来源于蝙蝠捕食时的回声定位行…

Python3 replace()函数使用详解:字符串的艺术转换

博主猫头虎的技术世界 &#x1f31f; 欢迎来到猫头虎的博客 — 探索技术的无限可能&#xff01; 专栏链接&#xff1a; &#x1f517; 精选专栏&#xff1a; 《面试题大全》 — 面试准备的宝典&#xff01;《IDEA开发秘籍》 — 提升你的IDEA技能&#xff01;《100天精通鸿蒙》 …

[从0开始AIGC][Transformer相关]:算法的时间和空间复杂度

一、算法的时间和空间复杂度 文章目录 一、算法的时间和空间复杂度1、时间复杂度2、空间复杂度 二、Transformer的时间复杂度分析1、 self-attention 的时间复杂度2、 多头注意力机制的时间复杂度 三、transformer的空间复杂度 算法是指用来操作数据、解决程序问题的一组方法。…

人工智能应用工程师特训营丨国家认证,行业必备

人工智能应用工程特训营 提升目标&#xff1a; 1、提高专业认可度&#xff0c;增强职场竞争力 2、实战项目驱动&#xff0c;提升应用能力 3、技术体系全面&#xff0c;涵盖多个领域 4、实时在线答疑&#xff0c;强化学习互动 特训营学习流程&#xff1a; 职业技术证书&#xff…

【鸿蒙开发】系统组件Text,Span

Text组件 Text显示一段文本 接口&#xff1a; Text(content?: string | Resource) 参数&#xff1a; 参数名 参数类型 必填 参数描述 content string | Resource 否 文本内容。包含子组件Span时不生效&#xff0c;显示Span内容&#xff0c;并且此时text组件的样式不…

数学基础:常见函数图像

来自&#xff1a; https://www.desmos.com/calculator/l3u8133jwj?langzh-CN 推荐: https://www.shuxuele.com/index.html 一、三角函数 1.1 正弦 sin(x) 1.2 余弦 cos(x) 1.3 正切 tan(x) 1.4 余切 cot(x) 1.5 正弦余弦综合 1.6 正切余切综合 二、指数对数

Linux内核自带的LED驱动实验:Led驱动功能测试

一. 简介 前面几篇文章学习了如何使用Linux内核自带的Led驱动。一篇文章通过对驱动分析&#xff0c;了解了驱动与设备匹配的关键点。 一篇文章学习了如何配置使能Linux内核自带的Led驱动&#xff0c;第二篇文章学习创建Led设备树节点&#xff08;针对使用Linux内核自带的Led…

HJ37 统计每个月兔子的总数(动态规划)

高端的食材&#xff0c;往往只需要最简单的烹饪方法。 import java.util.Scanner;// 注意类名必须为 Main, 不要有任何 package xxx 信息 public class Main {public static void main(String[] args) {Scanner sc new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的…

小米汽车:搅动市场的鲶鱼or价格战砧板上的鱼肉?

3月28日晚&#xff0c;备受关注的小米汽车上市发布会召开&#xff0c;小米集团董事长雷军宣布小米SU7正式发布。小米汽车在带飞股价的同时&#xff0c;二轮订购迅速售尽。 图一&#xff1a;小米集团股价 雷军口中“小米汽车迈出的第一步&#xff0c;也是人生最后一战的开篇”&a…