《c++ primer笔记》第九章 顺序容器
前言
知识点很多,这里只记录遗忘的。从这章开始会对前面章节的内容进行一个扩充,如果以前的忘了读起来会有点吃力。总的来说,本章节难度不大。
文章目录
- 一、概述
- 二、容器库概览
- 2.1容器定义和初始化
- 2.2赋值
- 三、顺序容器操作
- 3.1添加元素
- 3.2删除元素
- 3.3forward_list
- 3.4容器操作使迭代器失效
- 四、vector对象是如何增长的
- 五、string操作
- 5.1构造string 的其他方法
- 5.2改变string的其他方法
- 5.3string搜索操作
- 5.4compare函数
- 5.5数值转换
- 六、容器适配器
一、概述
顺序容器一共有六种类型:vector、deque、list、forward_list、array、string。下图是它们的一些特性。除了固定大小的array外,其他容器都提供高效、灵活的内存管理。vector、string和array之所以支持快速随机访问,是因为它们的元素存储在连续的内存空间中,所以进行插入删除操作就会很慢。而forward_list和list正好相反,它们存储元素的内存空间都是离散的,因此访问元素的开销较大。deque相对来说访问速度和某些情况的插入删除操作都比较高效。
array和forward_list都是C++11增加的新特性。array相对内置数组,效果更高、更安全。forward_list设计是为了达到与手写单向链表的性能。新标准库的容器优于旧版本。

二、容器库概览
2.1容器定义和初始化
将一个新容器创建为另一个容器的拷贝的方法:1)直接拷贝整个容器(两个容器的类型必须相同);2)拷贝一个由迭代器指定的元素范围(array除外)(两个迭代器的类型可以不同,只要元素能够转换)

与顺序容器大小相关的构造函数
如果元素类型是内置类型或者是具有默认构造函数的类类型,可以只为构造函数提供一个容器大小参数。如果元素没有默认构造函数,除了大小参数外,还必须指定一个显式的元素初始值。
array
array与内置数组很相似,当定义一个array时,除了指定元素类型,还要指定容器大小。
array<int, 42>
array<string, 10>
一个默认构造的array是非空的,如果我们对array进行列表初始化,初始值的数目必须等于或小于array的大小。内置数组不能对其进行拷贝或对象赋值操作,但是array没有限制
int d[3] = {1,2,3};
int c[3] = d[3]; // 错误
array<int, 3> d2 = {1,2,3};
array<int, 10> c2 = d2;
2.2赋值
赋值就是把左边容器的元素全部换成右边容器中元素的拷贝。只有顺序容器可以使用assign,但是array不支持assign操作。

assign
赋值运算符要求等号两边的运算对象具有相同的类型,assign允许从一个不同但相容的类型赋值,或者从容器的一个子序列赋值。使用assign会使左边容器内部的迭代器、引用和指针失效
swap
swap交换两个相同类型容器的内容,除string外,指向容器的迭代器、引用和指针在swap操作之后都不会失效。swap两个array会正在交换它们的元素
三、顺序容器操作
3.1添加元素
除了array,所有标准库容器都提供灵活的内存管理。下表是添加元素的的操作。前面提到,像vector、string等容器添加一个元素可能会导致整个对象的存储空间重新分配,所以当我们使用这些操作时,必须记得不同容器使用不同的策略来分配元素空间。

当我们将一个对象插入到容器时,实际上放入的是对象的拷贝,容器的元素与提供值的对象之间没有任何关联。
emplace
C++11引入了三个新成员:emplace_front、emplace、emplace_back,前面说了以前的插入元素的方法是拷贝,而这些新成员会进行构造,不会拷贝。下面一段代码很容易理解它们之间的差别。加入有一个info对象,它含有三个数据成员,且对应的构造函数。在使用emplace_back,我们可以在A的末尾添加一个Info对象,但是push_back却不行,因为它是拷贝元素,对于push_back的函数设计里面没有接收三个参数的版本,所以只能写成最后一行的形式,先构造,再拷贝。总之,emplace_back直接进行构造简化了操作过程。当然,如果Info对象没有对应三个参数的构造函数,那么该操作也会失效。
A.emplace_back("heyun",12,23);
A.push_back("heyun",12,23); // 错误
A.push_back(Info("heyun",12,23));
3.2删除元素
下标是删除元素的操作。

3.3forward_list
有C语言基础的应该都记得链表,forward_list其实就是一个单向链表。它的特殊之处在于,进行添加和删除元素时,删除或添加的元素之前的那个元素的后继会发生改变。

下表是forward_list特有的插入和删除元素操作。

3.4容器操作使迭代器失效
添加元素
vector和string,如果存储空间被重新分配,指向容器的迭代器、指针和引用都会失效。如果没有重新分配,则指向插入元素之间的有效,之后的全部失效。deque,除了在首尾之外的任何位置插入元素会让它们都失效,如果在首尾添加元素,迭代器会失效,但指向存在的元素的引用和指针不会失效list和forward_list,全部都有效
删除元素
list和forward_list,指向容器其他位置的迭代器全部都有效deque,在首尾之外的任何位置删除元素,指向被删除元素之外其他元素的迭代器、引用或指针也会失效。如果删除的是尾元素,则尾后迭代器也会失效,但是其他迭代器、引用和指针不受影响。如果删除首元素,这些都不受影响vector和string,指向被删除元素之前的有效。- 只要删除元素,尾后迭代器总是失效。
四、vector对象是如何增长的
第一次接触vector时,就很好奇这个和数组类似的存储容器居然有和链表一样的动态增加容量的功能。我们知道vector为了支持快速随机访问,里面的元素是连续存储的,如果这时vector的空间不足以接纳新的元素,可以再开辟一段连续的空间,就旧元素和新元素一起拷贝进去,最后删除旧的空间。这样虽然能够达到目的,但是经常进行性能会非常之慢。
C++标准库为了避免这种代价,设法减少容器空间重新分配次数的策略。当不得不获取新的内存空间时,vector和string的实现通常会分配比新的空间需求更大的内存空间。
我们可以人为的去管理容量的成员函数。对于reserve,只有当前需要的内存空间超过当前容量时才会改变vector的容量。

五、string操作
这一小节主要对第三章的string内容进行一个补充。
5.1构造string 的其他方法

5.2改变string的其他方法
string类型同样支持顺序容器的赋值运算符及assign、insert和erase操作。
s.insert(s.size(),5,'!'); // 在s末尾插入5个感叹号
s.erase(s.size() - 5,5); // 在s删除最后5个字符const char *cp = "Stately, plump Buck";
s.assign(cp,7); // s == "Stately"
s.insert(s.size(), cp + 7); // s == "Stately, plump Buck"


assign总是替换string中的所有内容,append总是将新字符追加到string末尾
5.3string搜索操作
string类提供了6个不同的搜索函数,每个函数都有4个重载版本,如下表所示。每个搜索操作会返回一个string::size_type值,表示匹配发生位置的下标,如果搜索失败,会返回一个名为string::npos的static成员。两个搜索操作的返回值类型都是一个unsigned类型,所以不要用带符号类型进行接收。


下面写几个书上的例子:
string name("AnnaBelle");
auto pos1 = name.find("Anna"); // pos1 = 0// 查找给定字符串中任何一个字符匹配的位置
string numbers("0123456789"), name("r2d2");
auto pos = name.find_first_of(numbers);
string dept("1231p23");
auto pos = dept.find_first_not_of(number); // 返回p的下标
5.4compare函数

5.5数值转换
C++11引入多个函数可以实现数值数据与标准库string之间的转换。

六、容器适配器
stack、queue和priority_queue是三个顺序容器适配器。一个适配器是一种机制,能使某种事物的行为看起来像另外一种事物一样。

定义一个适配器
每个适配器都定义两个构造函数:默认构造函数创建一个空对象,接受一个容器的构造函数拷贝该容器来初始化适配器。stack和queue基于deque实现,priority_queue在vector的基础上实现。
stack<int> stk(deq); // 从deq拷贝元素到stk
stack<string, vector<string>> str_stk; // 在vector上实现的空栈
所有适配器都要求容器具有添加和删除元素的能力,所以array不适用于适配器。同理forward_list也不行。
stack只要求push_back、pop_back和back,因此可以使用除array和forward_list之外的任何容器类型来构造stack。
queue要求back、push_back、front和push_front,因此可以构造于list或deque之上,但不能基于vector构造。
priority_queue除了front、push_back和pop_back操作之外还要求随机访问能力,可以构造于vector或deque之上,不能基于list构造。
栈适配器

队列适配器
priority_queue允许为队列中的元素建立优先级,也就是每个元素含有一个权重,权重大的会优先排在前面。

相关文章:
《c++ primer笔记》第九章 顺序容器
前言 知识点很多,这里只记录遗忘的。从这章开始会对前面章节的内容进行一个扩充,如果以前的忘了读起来会有点吃力。总的来说,本章节难度不大。 文章目录一、概述二、容器库概览2.1容器定义和初始化2.2赋值三、顺序容器操作3.1添加元素3.2删除…...
QML动画(弹动和翻转效果)
Flickable(弹动) QML中提供了一个Flickable元素,可以将其子项设置在一个可以拖拽和弹动的界面上,使得子项目的视图可以滚动。在传统的用户界面中,可以使用标准控件(如滚动条和箭头按钮)滚动视图…...
GPS启动方式、定位速度、定位精度介绍
前面文章介绍了GPS定位基础知识 GPS定位知识介绍 (qq.com) 本文主要介绍GPS启动方式。 定位过程中最重要的辅助信息是时间、星历、位置。 根据辅助信息不同,...
深度学习零基础学习之路——第五章 个人数据集的制作
Python深度学习入门 第一章 Python深度学习入门之环境软件配置 第二章 Python深度学习入门之数据处理Dataset的使用 第三章 数据可视化TensorBoard和TochVision的使用 第四章 UNet-Family中Unet、Unet和Unet3的简介 第五章 个人数据集的制作 深度学习数据集的制作Python深度学…...
女神节 | PHP和Java算什么,女工程师才是最美最好的语言!
世界上第一个程序员是女性 第一个发现Bug的也是女性 在智领云有一群追求快乐和独立的女性工程师 她们多有魅力? 工位上她们专注于数据与代码 平日里郊游、瑜伽、插花、科学养娃一件不落 不仅用0和1编织数字世界 也在用心装点自己的生活 今天是国际劳动妇女节…...
【Python】装饰器
一、装饰器的作用 装饰器能够为已经存在的对象添加额外的功能。 二、什么是装饰器 装饰器本质是一个python函数,它可以让其他函数在不需要做任何代码变动的前提下增加额外功能,装饰器的返回值也是一个函数对象。 三、装饰器的应用场景 插入日志、性能…...
Spring事务及传播机制
概念 在MySQL中介绍过,当同一时间出现一起读写数据的情况,可能会导致最终的结果出错,因此可以使用事务来提高隔离级别 而Spring中也可以实现事务 手动添加事务 使用SpringBoot中的DataSourceTransactionManager对象可以获取事务࿰…...
43-Golang中的goroutine!!!
Golang中的goroutine进程和线程说明并发和并行并发并行Go协程和Go主线程案例小结goroutine的调度机制MPG模式基本介绍MPG模式运行的状态1MPG模式运行的状态2设置GOlang运行的CPU数不同 goroutine之间如何通讯使用全局变量加锁同步改进程序进程和线程说明 1.进程就是程序在操作…...
[深入理解SSD系列 闪存实战2.1.5] NAND FLASH基本读操作及原理_NAND FLASH Read Operation源码实现
前言 上面是我使用的NAND FLASH的硬件原理图,面对这些引脚,很难明白他们是什么含义, 下面先来个热身: 问1. 原理图上NAND FLASH只有数据线,怎么传输地址? 答1.在DATA0~DATA7上既传输数据,又传输地址 当ALE为高电平时传输的是地址, 问2. 从NAND FLASH芯片手册可知,要…...
pandas库中的read_csv函数读取数据时候的路径问题详解(ValueError: embedded null character)
read_csv()函数不仅是R语言中的一个读取csv文件的函数,也是pandas库中的一个函数。pandas是一个用于数据分析和处理的python库。它的read_csv函数可以读取csv文件里的数据,并将其转化为pandas里面的DataFrame对象。它由很多参数可以设置,例如…...
【量化交易笔记】4.移动平均值的实现
上一讲已经讲A股的数据下载到本地或保存数据库,我们可以随时使用。 移动平均MA(Moving Average) ,是用统计分析的方法,将一定时期内的证券价格(指数)加以平均,并把不同时间的平均值连接起来,形成…...
2023年3月份的野兔在线工具系统版本更新
这个是野兔在线工具系统中文版更新,这次更新的功能,和修改的问题还是比较多的,也修复系统部分功能,应该也是目前市面上在线工具比较多的一个系统了。系统名称:野兔在线工具系统系统语言:中文版系统源码&…...
科技成果赋智中小企业深度行 边界无限靖云甲ADR入选十大优秀案例
近日,国家工业信息安全发展研究中心、青岛市工业和信息化局、青岛市民营经济发展局、青岛市即墨区人民政府、青岛蓝谷管理局联合举办的科技成果赋智中小企业“深度行”活动(青岛站)成功举办,同步举行了赋智“深度行”活动…...
我们的理性何处安放
每天工作压力和各种人相处都让我们非常忙碌,我们上大学,努力工作,都是想获得更好的人生场景,素养,提升自身的认知,这样就是对我们大多数人生最负责任。如何让自己理性与人为善,并能被人温柔以待…...
RecyclerView的详细使用
首先就是了解ListView和RecyclerView的区别1.ListView相比RecycleView的优点a.ListView实现添加HeaderView和FooderView有直接的方法b.分割线可以直接设置c.ListView实现onItemClickListence和onItemLongClickListence有直接的方法2.RecyclerView相比ListView的优点a.封装了Vie…...
一、向量及其线性运算
🙌作者简介:数学与计算机科学学院出身、在职高校高等数学专任教师,分享学习经验、生活、 努力成为像代码一样有逻辑的人! 🌙个人主页:阿芒的主页 ⭐ 高等数学专栏介绍:本专栏系统地梳理高等数学…...
Spring Cloud/Spring Cloud Alibaba核心知识总结
Spring Cloud核心知识总结 springCloud是一个服务治理平台,若干个框架的集合,提供了全套的分布式系统的解决方案。包含:服务注册与发现、配置中心、服务网关、智能路由、负载均衡、断路器、监控跟踪、分布式消息、分布式事务等等。 SpringC…...
Locust框架从0到1入门
Locust介绍 Locust是使用Python语言编写实现的开源性能测试工具,可以用来测试Web应用程序、API、数据库等各种应用程序的性能,使用起来简洁、轻量、高效,并发机制基于gevent协程,可以实现单机模拟生成较高的并发压力。中文意为&a…...
C++:整数(short ,int,long,long long)表示范围
整形 C用short、int、long 、long long来表示整数的整形,同一整形也分为有符号(signed)和无符号(unsigned)两种。数据长度与操作系统和编译器的位数有关,其能够表示的范围也有所不同。接下来本文将用代码的…...
会声会影2023旗舰版新功能介绍,Corel VideoStudio Ultimate2023以及电脑系统配置要求
会声会影2023中文旗舰版功能非常强大的视频编辑软件,非常专业的使用效果,会声会影2023中文版可以针对剪辑电影进行使用,非常强大的色彩校正方式,无论什么光线下进行拍摄,都可以通过后期进行调整,并且里面超…...
测试微信模版消息推送
进入“开发接口管理”--“公众平台测试账号”,无需申请公众账号、可在测试账号中体验并测试微信公众平台所有高级接口。 获取access_token: 自定义模版消息: 关注测试号:扫二维码关注测试号。 发送模版消息: import requests da…...
19c补丁后oracle属主变化,导致不能识别磁盘组
补丁后服务器重启,数据库再次无法启动 ORA01017: invalid username/password; logon denied Oracle 19c 在打上 19.23 或以上补丁版本后,存在与用户组权限相关的问题。具体表现为,Oracle 实例的运行用户(oracle)和集…...
JavaSec-RCE
简介 RCE(Remote Code Execution),可以分为:命令注入(Command Injection)、代码注入(Code Injection) 代码注入 1.漏洞场景:Groovy代码注入 Groovy是一种基于JVM的动态语言,语法简洁,支持闭包、动态类型和Java互操作性,…...
vscode里如何用git
打开vs终端执行如下: 1 初始化 Git 仓库(如果尚未初始化) git init 2 添加文件到 Git 仓库 git add . 3 使用 git commit 命令来提交你的更改。确保在提交时加上一个有用的消息。 git commit -m "备注信息" 4 …...
【CSS position 属性】static、relative、fixed、absolute 、sticky详细介绍,多层嵌套定位示例
文章目录 ★ position 的五种类型及基本用法 ★ 一、position 属性概述 二、position 的五种类型详解(初学者版) 1. static(默认值) 2. relative(相对定位) 3. absolute(绝对定位) 4. fixed(固定定位) 5. sticky(粘性定位) 三、定位元素的层级关系(z-i…...
1.3 VSCode安装与环境配置
进入网址Visual Studio Code - Code Editing. Redefined下载.deb文件,然后打开终端,进入下载文件夹,键入命令 sudo dpkg -i code_1.100.3-1748872405_amd64.deb 在终端键入命令code即启动vscode 需要安装插件列表 1.Chinese简化 2.ros …...
Cinnamon修改面板小工具图标
Cinnamon开始菜单-CSDN博客 设置模块都是做好的,比GNOME简单得多! 在 applet.js 里增加 const Settings imports.ui.settings;this.settings new Settings.AppletSettings(this, HTYMenusonichy, instance_id); this.settings.bind(menu-icon, menu…...
TRS收益互换:跨境资本流动的金融创新工具与系统化解决方案
一、TRS收益互换的本质与业务逻辑 (一)概念解析 TRS(Total Return Swap)收益互换是一种金融衍生工具,指交易双方约定在未来一定期限内,基于特定资产或指数的表现进行现金流交换的协议。其核心特征包括&am…...
SAP学习笔记 - 开发26 - 前端Fiori开发 OData V2 和 V4 的差异 (Deepseek整理)
上一章用到了V2 的概念,其实 Fiori当中还有 V4,咱们这一章来总结一下 V2 和 V4。 SAP学习笔记 - 开发25 - 前端Fiori开发 Remote OData Service(使用远端Odata服务),代理中间件(ui5-middleware-simpleproxy)-CSDN博客…...
rnn判断string中第一次出现a的下标
# coding:utf8 import torch import torch.nn as nn import numpy as np import random import json""" 基于pytorch的网络编写 实现一个RNN网络完成多分类任务 判断字符 a 第一次出现在字符串中的位置 """class TorchModel(nn.Module):def __in…...
