C++——vector(2)

news2024/11/13 23:45:45

作者:几冬雪来

时间:2023年9月15日

内容:C++——vector知识讲解

目录

前言: 

vector:

构造函数:

创建模板: 

reserve/push_back:

迭代器/capacity和size: 

insert: 

改进: 

拓展: 

结尾:


前言: 

在前一篇博客中我们初步的了解了C++的知识,并且通过和string的对比,我们也是发现了二者的相似之处。因此在书写vector的时候,成本要比string的时候小一些。而今天我们将继续来接收vector。

vector<string>:

在第一篇博客中我们就有说到,在写代码的时候可以将string嵌套在vector当中,这种方式的结果也就是大家熟知的二维数组

那么vector<string>是如何实现的呢,它又是什么样子的?在这里画一张图来了解它。

构造函数:

同样的vector也可以进行构造函数。

那么如果要在头文件中对其进行构造,我们要如何对其进行书写,它的书写形式和string的时候一样吗

为了探讨这个问题,我们拿来了一份库中的代码来观察

这就是库中vector中push_back和reserve的构造函数的写法

这个有人就要说了,库中的好多英文词都没懂,比如allocate_and_copy,destroy等等。但是即使不知道这些词的意思,我们也可以依靠代码去推断出它在此处的作用

那为什么要去看库里面的代码呢?

这是因为以后去实习的时候,我们是不可能一开始就对一个项目从头负责到尾的,因此在这之前有不少人都写过代码,这个时候就要去推测哪段代码是什么意思了

在进行了逐步解析之后,我们可以得到这一张图片。

那么依靠这一张图片中的逻辑和方式,我们就可以来书写自己的代码。 

因为头文件要一次将代码全部输入并且讲解完毕难度过大,因此在讲解哪部分哪部分代码的时候我们会将其分开说明

创建模板: 

一开始既然要构建函数,那么模板就是必不可少的东西。

因为string和vector有相似之处,因此二者的模板的写法也是及其的相似,这里就不过多的进行讲解了。 

至于下面的_start,_finish和_endofstorage则是跟我们库中的保存一致。作用在上面有对其进行说明。

reserve/push_back:

接下来就是我们插入数据和扩容的操作了,这两个英文相信大家也不会太陌生

 

先来讲解reserve,一开始还是老规矩判断是否需要进行扩容操作

根据库中的代码,开头我们需要创建一个sz来保存我们旧数据的size,这是因为在后面赋值给_finish的时候,如果不保存的话原先的数据会被修改

下来就是走流程,开辟新空间。判断然后对其进行拷贝,最后删除原空间的数据再对新空间进行标记

 

然后就是我们的插入值的代码。

首先还是判断空间是否已经是满了的状态,如果满了的话这个地方就需要判断扩容的大小。要是一开始capacity为0的话,这里就开4个大小的空间,否则就开原空间的两倍大小

然后用reserve来进行扩容。最后在将_finsih进行赋值就行了。 

迭代器/capacity和size: 

再下来就是我们的迭代器了,这里的begin和end就不需要多讲了。

要注意的一个点是要将_start这些都nullptr成空。 

同样的size和capacity就只需要计算出来它们的返回值就行了。 

写到这里大家再去看我们头文件里面的代码, _start, _finish,_endofstorage。这三个名词我们极少用到,看起来还不如当初书写string的时候。

但是这并不是就代表它们可以被忽略,接下来我们就再写一个接口来看看。

insert: 

同样的在string中insert也有出场过,它代表的意思是在某个位置插入一个值

那么如果要将其书写在头文件中是怎么样的形式呢?

这里我们来写写看

首先pos是要选择插入的位置,x是想要插入的值

在插入数据之前要先对其位置进行判断,插入的位置需要在空间当中,不然会出问题。

判断的时候我们加入了“<=”和“>=”并不是单纯的“<”和“>”,这是因为insert代码也可以用做头插和尾插。 

然后是判断是否需要进行扩容操作

 

再接下来就需要对pos位置后的数组进行进行一个后移的操作,让pos处插入x的时候不用覆盖原数据。 

最后再将x值交给pos位置,并且因为插入了一个值,因此_finish也要往后增加一格。 

到这里我们的insert代码就完成了一大半了。

为什么说的一大半呢,知识因为在这其中还有隐藏的问题所在。 

 

刚刚就有说过,insert可以运用于头插操作

但是当满足一定条件的时候,这个时候我们会插入失败。 

那个问题被我们叫为迭代器失效,在我们插入数据的时候(插入4/8个后进行扩容)。因为要扩容,原位置的数据要进行删除,这里在原数据中的pos也会被删除。 

这就是导致插入的数据可能变成随机数。 

改进: 

 

要对代码进行改进的话,就需要我们保存pos,最后再把pos给数组就行。 

拓展: 

这里我们就解决了代码内部的迭代器失效的问题。

这里提到了内部,那是因为还存在有外部的迭代器失效。 

 

像这个样子就可能会导致外部的迭代器失效。

在头文件中,pos并不是被const过的(头文件const后还修改很多东西),因此它是传值返回,这里数据的改变并不会影响到最后的结果。 

这里要记住一个点,insert以后迭代器看看你会失效(扩容条件不同),因此insert以后就不要使用这个形参迭代器了,因为他可能已经失效了

结尾:

到这里我们的又一篇vector的讲解结束了,也是快到我们的vector结束的篇章了。下一篇博客可能就会将vector完结,并且也会讲解vector中从的一些问题,最后希望这篇博客可以帮到各位。

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

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

相关文章

基于springboot+vue的大学生智能消费记账系统

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战 主要内容&#xff1a;毕业设计(Javaweb项目|小程序等)、简历模板、学习资料、面试题库、技术咨询 文末联系获取 项目介绍…

OPTEE异常调用栈解析

安全之安全(security)博客目录导读 目录 一、OPTEE标准的异常调用栈格式 二、OPTEE异常调用栈解析脚本 三、如何执行解析命令 四、OPTEE异常调用栈解析结果 序言&#xff1a;当OPTEE发生异常时&#xff0c;安全控制台会输出dump信息&#xff0c;虽然有了Call stack&#x…

企业级SpringBoot单体项目模板 —— 基础应用搭建

&#x1f61c;作 者&#xff1a;是江迪呀✒️本文关键词&#xff1a;SpringBoot项目模板、工程、MyBatis-plus☀️每日 一言&#xff1a;你那么在意不喜欢你的人的言语&#xff0c;这对喜欢你的人来说很不公平 一、创建一个Maven项目 Maven的安装自己百度。 2.1 …

新能源汽车驱动电机的基本知识

学习目标:了解电机的基本知识。能力目标:培养学生搜集和整理相关资料的能力。素质目标:培养学生良好的职业素养。额定电店.在夫见定条件下电池工作的*于佳 电压知识准备术语和定义。 (1)驱动电机系统 通过有效的控制策略将动力蓄电池提供的直流电转化为交流实现电机的正转以及反…

在Linux上配置Spug自动化运维平台,实现公网远程访问

文章目录 前言1. Docker安装Spug2 . 本地访问测试3. Linux 安装cpolar4. 配置Spug公网访问地址5. 公网远程访问Spug管理界面6. 固定Spug公网地址 前言 Spug 面向中小型企业设计的轻量级无 Agent 的自动化运维平台&#xff0c;整合了主机管理、主机批量执行、主机在线终端、文件…

Keepalived 高可用(附带配置实例,联动Nginx和LVS)

Keepalived 一、Keepalived相关知识点概述1.1 单服务的风险&#xff08;单点故障问题&#xff09;1.2 一个合格的集群应该具备的特性1.3 VRRP虚拟路由冗余协议1.4 健康检查1.5 ”脑裂“现象 二、Keepalived2.1 Keepalived是什么&#xff1f;2.2 Keepalived体系主要模块及其作用…

机器学习技术(十)——决策树算法实操,基于运营商过往数据对用户离网情况进行预测

机器学习技术&#xff08;十&#xff09;——决策树算法实操 文章目录 机器学习技术&#xff08;十&#xff09;——决策树算法实操一、引言二、数据集介绍三、导入相关依赖库四、读取并查看数据1、读取数据2、查看数据 五、数据预处理1、选择数据2、数据转码 六、建模与参数优…

成都收录《乡村振兴战略下传统村落文化旅游设计》许少辉八一著作

成都收录《乡村振兴战略下传统村落文化旅游设计》许少辉八一著作已收录至成都

类和对象三大特性之多态

全文目录 虚函数虚函数的重写接口继承和实现继承重载、重写&#xff08;覆盖&#xff09;、隐藏&#xff08;重定义&#xff09;C11 override 和 final抽象类 多态的概念多态原理虚函数表 单继承和多继承的虚函数表打印虚函数表单继承的虚函数表多继承的虚函数表 常见面试问答题…

Cinema 4D 2024 for Mac:创造无限可能的3D艺术之旅

如果你追求极致的3D图形设计和动画制作&#xff0c;那么Autodesk的Cinema 4D 2024软件绝对是你不容错过的选择。尤其是对于Mac用户&#xff0c;这个强大的工具将提供给你无与伦比的工作效率和创造力。 在Cinema 4D 2024中&#xff0c;你可以通过直观的界面和高效的工作流程&am…

大数据之-kafka学习笔记

Kafka Kafka 是一个分布式的基于发布/订阅模式的消息队列&#xff08;Message Queue&#xff09;&#xff0c;主要应用于大数据实时处理领域。 Kafka可以用作Flink应用程序的数据源。Flink可以轻松地从一个或多个Kafka主题中消费数据流。这意味着您可以使用Kafka来捕获和传输…

数字人直播助力商家降本增效,AI数字人主播成为商家直播新选择

随着人工智能技术、云计算、5G移动通信等技术的发展&#xff0c;AI数字人行业不断加快各种应用场景落地。数智创研院的《2022数智人分析洞察报告》显示&#xff0c;中国AI数智人市场规模呈现高速增长趋势&#xff0c;预计到2026年将达102.4亿元。 尤其是在直播领域&#xff0c…

arkworks工具栈概览

1. 引言 arkworks定位为zkSNARK编程的Rust生态。其开源代码见&#xff1a; https://github.com/arkworks-rs/ arkworks目前已广泛用于大量项目中&#xff0c;如&#xff1a;Aleo、anoma、celo、Espresso、Findora、Manta、Mina、Nimiq、penumbra等等。 参与arkworks开源实现…

黑客必备工具Kali Linux,安装与使用教程全包含,从入门到精通,全网最详细全面的Kali Linux教程

Kali Linux是一个高级渗透测试和安全审计Linux发行版&#xff0c;目前可以说是网络安全人员的专用系统。 Kali Linux功能非常强大&#xff0c;能够进行信息取证、渗透测试、攻击WPA / WPA2保护的无线网络、离线破解哈希密码、将android、Java、C编写的程序反编译成代码等等&am…

CRM与chatGPT结合的效果

2023年ChatGPT是当之无愧的行业热词&#xff0c;从诞生到爆红短短5天&#xff0c;注册用户数就超过100万&#xff0c;截止到2023年1月底已经有超过1亿用户。在这样的背景下&#xff0c;Zoho CRM系统在业内较早推出集成ChatGPT的相关功能&#xff0c;接下来我们就来分享CRM接入C…

【Unity】ShaderGraph应用(浮动气泡)

【Unity】ShaderGraph应用(浮动气泡) 实现效果 一、实现的方法 1.使用节点介绍 Position&#xff1a;获取模型的顶点坐标 Simple Noise:简单的噪声&#xff0c;用于计算顶点抖动 Fresnel Effect&#xff1a;菲涅耳效应&#xff0c;用于实现气泡效果 计算用节点 Add&…

大模型赛道如何实现华丽的弯道超车

导读&#xff1a;Alluxio作为一款强大的分布式统一大数据虚拟文件系统&#xff0c;已经在众多领域展现出了其卓越的应用价值&#xff0c;并且为AI/ML训练赋能提供了一个全新的解决方案。 在人工智能&#xff08;AI&#xff09;和机器学习&#xff08;ML&#xff09;领域&#x…

基于STM32的简化版智能手表

一、前言 本文的OLED多级菜单UI为一个综合性的STM32小项目&#xff0c;使用多传感器与OLED显示屏实现智能终端的效果。项目中的多级菜单UI使用了较为常见的结构体索引法去实现功能与功能之间的来回切换&#xff0c;搭配DHT11&#xff0c;RTC&#xff0c;LED&#xff0c;KEY等器…

752. 打开转盘锁

链接&#xff1a; 752. 打开转盘锁 题解&#xff1a; class Solution { public:int openLock(vector<string>& deadends, string target) {std::unordered_set<std::string> table(deadends.begin(), deadends.end());if (table.find("0000") ! t…