C++primer(第五版)第九章(顺序容器)

news2024/12/26 11:32:55

简单来说存入顺序和取出顺序一致的容器被称为顺序容器.

9.1顺序容器概述

vectorstring将元素保存在连续的内存空间中,所以每次添加或删除元素都会非常耗时,但是通过下标计算内存地址来读取元素是非常快的.

listforward_list为链表,添加或删除元素的操作很快,但是不支持元素的随机访问,为了访问一个元素,可能需要从头开始遍历整个容器..

dequevector,string一样支持快速随机访问,

forward_list和array是C++新标准增加的类型. 

array和数组使用上基本一致,但比原生的数组更安全,更容易使用(书上这么说).

C++中推荐使用标准库容器,而不是原始的数据结构.

一般情况下,没有更好的理由的时候,推荐使用vector.

9.2容器库概览

 9.2.1迭代器

迭代器是可以通过解引用*来获取指向的元素值.通过容器的begin和end获取到的迭代器为迭代器范围,是左闭右开区间:[begin,end).(解引用容器的begin可以得到容器的第一个元素,解引用容器的end()-1,可以得到容器的最后一个元素,)

 另外,上例迭代器的类型是vector<int>::iterator;记不住就写auto.

9.2.2容器类型成员

没啥可说的

9.2.3 begin和end成员

begin和end有多种版本,开头带r的是反向迭代器,加c的是返回const迭代器,当不需要通过迭代器修改元素时,推荐使用cbegin和cend.

9.2.4容器定义和初始化

当一个容器初始化为另一个容器的拷贝时,两个容器的容器类型和元素类型必须相同.

初定义一个array时除了元素类型,还需要指定容器大小,因为大小也是类型的一部分:

array<int,10> a;    //大小为10,元素类型为int的array容器

array和内置数组不同的是,内置数组不能进行拷贝或对象赋值操作,但array可以.

9.2.5 赋值和swap

 swap交换后,元素本身未交换,swap只是交换了两个容器的内部数据结构,由于元素不会被移动,那么swap可以在常数的时间内完成(快).

 我们可以从上面的例子中看出交换前后,同一个地址的元素并没有发生改变.

但是如果swap的是两个array,那么两个arrary会真正地交换它们的元素.

9.2.6容器大小操作

成员函数size返回容器中元素的数目.empty返回容器是否为空.max_size返回一个大于或等于该类型容器所能容纳的最大的元素数.capacity返回容器的容量.

容器容量>=容器元素数目.

9.2.7关系运算符

每个容器类型都支持==和!=的比较,会对两个容器进行逐元素对比.

只有当容器元素类型定义了相应的比较运算符(<,>,<=,>=)时,才可以使用关系运算符来比较两个容器.

9.3顺序容器操作

9.3.1向顺序容器添加元素

 在vector或string的尾部之外的任何位置或是deque的首位之外的位置添加元素,都需要移动元素.并且可能会引起vector和string整个对象存储空间的重新分配.

本章建议去力扣找几道题目去刷一下,熟悉熟悉C++的容器以及对应的操作方法.

9.3.2访问元素

 下标越界是很严重的错误,然而编译器不检测这样的错误.

使用at成员函数访问元素可以检测出下标越界错误.

9.3.3删除元素

和其他语言不同的是,C++的pop不会把删除的元素返回,而是返回void,如果需要弹出的值,那么需要提前保存下来.

9.3.4 特殊的forward_list操作

 9.3.5改变容器大小

 9.3.6容器操作可能使迭代器失效

因为容器操作可能导致容器的存储地址改变.

不要保存end返回的迭代器!

9.4 vector对象是如何增长的

为了减少因为改变容器内容而重新分配内存地址的次数,vector通常会保留比size更大的地方,来避免每次添加元素都要重新分配内存地址,这就是为什么之前说容量>=大小的原因.

 容器的size是指容器已有的元素数目.容器的capacity是指在不分配新的内存空间的前提下可以保存多少元素.

可以调用shrink_to_fit来要求vector将超出当前大小的多余内存退还给系统.

 然后shrink_to_fit只是请求,并不保证标准库一定会退还内存.

9.5额外的string操作

9.5.1构造string的方法

9.5.2改变string的其他方法

 9.5.3string搜索操作

 9.5.4 compare函数

 9.5.5数值转换

 9.6容器适配器

标准库定义了三种顺序容器适配器:statck(栈),queue(队列),priority_queue.

适配器是标准库中的通用概念,本质上适配器是一种机制,使得某种事物的行为看起来像另一种事物.

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

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

相关文章

QT——使用QListWidget、QListWidgetItem、QWidget实现自定义管理列表

作者&#xff1a;小 琛 欢迎转载&#xff0c;请标明出处 文章目录 需求场景思路描述Qt模块QListWidgetQListWidgetItem自定义QWidget配合QListWidget 例子&#xff1a;实现一个json文件管理窗口 需求场景 因工作需要&#xff0c;开发一个文件管理窗口&#xff0c;要让使用者可…

蓝牙通过串口获取电量!!!

问题&#xff1a;样机短时间出现电池没电情况&#xff08;异常放电&#xff09;&#xff0c;经过检查&#xff0c;蓝牙在休眠是会有2.1V左右的电压&#xff0c;导致电池电量消耗过快。机器由于有语音功能&#xff0c;播放语音时需要很大电流&#xff0c;给机器装的是两节南孚电…

UE4/5数字人Metahuman与iClone的使用【数字人与动画】

iClone软件下载 iClone 8 是一款由Reallusion开发的3D动画软件&#xff0c;接下来就不多说了&#xff0c;首先进入官网&#xff0c;我们可以看到两个下载的东西&#xff0c;左边是下面这个软件&#xff0c;直接下载即可&#xff0c;右边的我们在后面下载&#xff1a; iClone插…

将DES解密用Python实现

将此段代码用python实现 var CryptoJS require("crypto-js"); var ciphertext "1MpdxK203ZrnyxuJRrYatKSBxHUIi1TSdQF2BQKXOG54plwfaB2GA"; var key CryptoJS.enc.Utf8.parse("11"); var parsedCiphertext CryptoJS.enc.Base64.parse(ciphe…

6月VR大数据:Quest 2下跌2个百分点,SteamVR统计加入大朋E4

Hello大家好&#xff0c;每月一期的VR内容/硬件大数据统计又和大家见面了。 想了解VR软硬件行情么&#xff1f;关注这里就对了。我们会统计Steam平台的用户及内容等数据&#xff0c;每月初准时为你推送&#xff0c;不要错过喔&#xff01; 本数据报告包含&#xff1a;Steam VR硬…

计算机找不到msvcr120.dll无法安装启动,三招修复方法

在安装运行软件的时候&#xff0c;计算机提示“找不到msvcr120.dll”&#xff0c;“msvcr120.dll缺失”无法启动运行是什么原因呢&#xff1f;msvcr120.dll是一个Windows系统的动态链接库&#xff0c;它是Microsoft Visual C Redistributable for Visual Studio 2013的一部分。…

Rosetta从头蛋白抗体设计、结构优化及在药物研发中的应用专题

第一天 时间:AM9:00~9:50 内容:一.从蛋白质折叠到蛋白质设计 教学目标&#xff1a;了解本方向内容、理论基础、研究意义。主要知识点 主要知识点:1蛋白质折叠与结构预测简介 1.1主链二面角与二级结构 1.2侧链堆积与三级结构 2蛋白质设计简介 2.1蛋白质设计的分类及应用 时间:AM…

DataGrip编写SQL语句操作Spark(Spark ThriftServer)

文章目录 1.Spark ThriftServer2.启动 Spark ThriftServer3.Beeline方式连接4.DataGrip方式连接5. 代码方式6. SparkSQL运行方式7.参考文章 1.Spark ThriftServer Spark ThriftServer 相当于一个持续性的Spark on Hive集成模式&#xff0c;可以启动并监听在10000端口&#xff…

盘口策略 | 交易中最重要的是什么?

量化策略开发&#xff0c;高质量社群&#xff0c;交易思路分享等相关内容 『正文』 ˇ 交易中最重要的是什么&#xff1f; 当然是Timing啊~~~ “时机是这个世界上最难得到&#xff0c;又最容易失去的东西”夫难得而易失者,时也&#xff1b;时至而不旋踵者,机也,故圣人常顺时…

浅谈Java8中map的新方法

Map在java8中新增了两个replace的方法 1.replace(k,v) 在指定的键已经存在并且有与之相关的映射值时才会将指定的键映射到指定的值&#xff08;新值&#xff09; 在指定的键不存在时&#xff0c;方法会return回来一个null javadoc的注释解释了该默认值方法的实现的等价Java…

Web安全-Godzilla(哥斯拉)Webshell管理工具使用

为方便您的阅读&#xff0c;可点击下方蓝色字体&#xff0c;进行跳转↓↓↓ 01 工具下载地址02 运行环境03 工具介绍04 使用案例 01 工具下载地址 https://github.com/BeichenDream/Godzilla点击页面右侧"releases"&#xff0c;进入工具的版本下载页面。 在个人终端…

安装配置云计算模板机

安装虚拟机模板机 一、在VMware上安装Centos虚拟机二、修改虚拟机的ip、网关、DNS三、更换yum源3.1 更换本地yum源3.2 更换国内互联网Yum源 四、 安装net-tools和bash-completion五、 关闭防火墙和SELinux 学习云计算后续需要多个虚拟机&#xff0c;作为云计算集群的节点&#…

数据结构--初识栈和队列

1.栈 1.1栈的概念及结构 栈&#xff1a;一种特殊的线性表&#xff0c;其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶&#xff0c;另一端称为栈底。栈中的数据元素遵守后进先出LIFO&#xff08;Last In First Out&#xff09;的原则。 压…

神级 IDEA 插件!效率提升 50 倍!

安装好Intellij idea之后&#xff0c;进行如下的初始化操作&#xff0c;工作效率提升50倍。 一. 安装插件 1. Codota 代码智能提示插件 只要打出首字母就能联想出一整条语句&#xff0c;这也太智能了&#xff0c;还显示了每条语句使用频率。原因是它学习了我的项目代码&#…

4.从CPU缓存结构到原子操作

一、CPU缓存结构 1.1 CPU的多级缓存 因为CPU的计算速度非常快&#xff0c;但内存的访问速度相对较慢。因此&#xff0c;如果CPU每次都要从内存读取数据&#xff0c;会造成大量的等待时间&#xff0c;降低整体性能。 通过引入多级缓存&#xff0c;可以在CPU和内存之间建立数据…

html5学习精选5篇案例

html5学习心得1 一&#xff1a;了解HTML5前端开发技术 HTML 指的是超文本标记语言 (Hyper Text Markup Language)&#xff0c;标记语言是一套标记标签 (markup tag)&#xff0c;HTML 使用标记标签来描述网页。HTML5区别于HTML的标准&#xff0c;基于全新的规则手册&#xff0…

stm32mp157aaa裸机开发学习之led灯亮灭

asm-led.S .text .global _start _start: /**********LED1点灯**********//**********RCC章节初始化**********/ RCC_INIT:通过RCC_MP_AHB4ENSETR寄存器使能GPIOE组控制器 0x50000A28[4] 1ldr r0,0x50000A28 LED1 GPIOE10 LED3 GPIOE8ldr r1,[r0]orr r1,r1,#(0x1 << 4…

vite4+vue3:从0到1搭建vben后台管理系统(四)-封装dayjs的日历组件

前言 在后台管理系统中,封装vue的日历组件是很常见的一个功能,有时候antdvue里面的组件跟我们业务需求差异比较大时,去改antdui的官方组件比较麻烦,这个时候,我们就得自己去封装这样一个日历组件,效果如下图所示: 两种实现方式之vue2.x的实现 <template><div&…

用简单易懂的方式手写一个单例模式,看了不会来打我

文章目录 一、如何手写一个单例模式1.1 什么是单例模式1.2 单例模式的适用场景1.3 单例模式的设计原理1.4 单例模式的实现方案1.5 代码测试 一、如何手写一个单例模式 1.1 什么是单例模式 单例模式是一种常用的软件设计模式&#xff0c;它的核心是只包含一个实例的特殊类。单…

每日一道算法题--进制转换

进制转换 题目来源解题思路代码 题目来源 题目链接: 进制转换 解题思路 首先&#xff0c;从标准输入读取两个整数 M 和 N&#xff0c;分别表示待转换的十进制数和目标进制。如果输入的十进制数 M 等于 0&#xff0c;直接输出 0 并返回。判断输入的十进制数是否为负数&#xf…