C++——vector(3)

news2025/5/26 13:12:56

作者:几冬雪来

时间:2023年9月20日

内容:C++部分——vector内容讲解

目录

前言: 

erase: 

erase和insert总结:

resize:

深拷贝: 

赋值: 

结尾:


前言: 

在上一篇博客中我们更加介绍了vector的定位还特别的介绍了它的几个常用接口,也对接口的使用方法,注意事项,可能出错的地方以及接口的拓展都多多少少有些讲解,今天我们将继续对vector板块的知识进行补全。 

erase: 

在上一篇博客中我们讲解了insert,它的作用是在某个位置插入某个数据,也可以运用于头插和尾插

既然vector中有insert接口,那么肯定也存在作用与之相反的接口

erase接口,与insert相反,它的作用是删除某个位置的值。 

在理解完了insert之后,erase代码的意思我们也可以简单的看出来。

首先,删除的数据一定是要有效的,因此一开始要对其进行断言

接下来用it存放pos的下一个值。 

简单来说就是pos的下一个值覆盖原pos位置的值,然后it加加再次进行覆盖,最后it等于_finish的时候我们要将最后一个值删去。 

和insert会发生迭代失效一样,在某些特殊的情况下,erase也会发生迭代器失效的问题

与此同时我们的erase还有一个可能会出错的地方。

类似上边画的这种情况。

在这里我们想要删除5这个数据,一般来说删除数据的本质就是数据的覆盖,但是在5的后面并没有数据让我们进行覆盖的操作,这个时候就需要去移动_finish

但是代码中的it有进行++操作,这就会导致_finish和it错位开来,循环的条件永远都无法完成,且处于越界的状态

erase和insert总结:

在学习完了erase和insert之后,我们对其进行了一个大致的总结。

vector中,erase和insert迭代器对象后,不能再去访问那个迭代器。我们认为他失效,访问结果是未定义

resize:

在vector第一篇博客当中,我们讲解了resize和reserve的作用和区别,并且书写了它们的代码比较。

在今天我们将试一试在头文件中书写resize接口

这个地方我们放出可能会导致resize有3种不同书写格式的图。

在讲解resize的时候我们还有一种就是resize(x,y)的写法,这种写法就是开辟x的空间,每个位置的值都是y

接下来就在头文件处编写代码。 

这里就是resize的代码,然后要判断其大小,如果n小于size的话,这个地方就可以直接进行填值

如果大于,那么就先进行扩容操作最后再将其赋值,并且_finish也要进行移动,最后移动到_start+n的位置。 

但是在写resize代码的时候要注意一个点,就是在后一个想要传递的值不能直接写为int或者char类型

这是因为我们并不知道resize会被输入什么类型的值,可能是整形也可能是字符类型,因此这个地方需要我们传递一个缺省值让它自己判断

深拷贝: 

接下来就是讲解的是vector的一个重要的知识点。 

在vector中也存在着深浅拷贝的问题vector的书写中我们该运用的不是浅拷贝而是深拷贝。那么浅拷贝是什么样子的?

这就是浅拷贝的书写,两个v1和v都指向了同一块位置。因此析构的时候,它会被析构两次,这就导致代码的崩溃。     

在深拷贝中,还将其做了区分,一种是传统的深拷贝的书写,另外一种是偏今天的深拷贝的写法,这里我们就介绍一下传统的深拷贝的写法。 

在这里也是一样先创建出来_start等,将它们置空

接下来对其进行赋值,将v的_start,_finish等数据赋值给v1的_start,_finish,这就是我们传统的深拷贝

  

下面这一张图则是我们偏现代的书写方法,但是两种方法都是可以使用的,没有分谁优谁劣的说法。 

赋值: 

赋值是我们学习C语言和C++一定会认识的一个操作符,那么在vector使用赋值操作的时候要注意什么呢?

同样的,赋值操作在vector中也会涉及深浅拷贝的问题,也是两个定义指向了同一块位置

那么在头文件中,赋值操作又要怎么去写呢? 

头文件中也只是需要创建一个swap来讲v1的_start等值赋值给v2,最后返回*this即可完成vector中的赋值操作

其实到这里上面的浅拷贝都并不是什么大问题,接下来我们就来讲解vector中会因为浅拷贝而出现的问题。 

在这里我们可看见最后结果处显示代码为-10737···,这就表示代码出现了错误

这个地方隐藏着一个深拷贝的问题

在这个地方也是在扩容的时候出现了问题(4个的时候为正常结果),那么是什么问题。 

 

因为我们的代码是vector中包含着string,因此和整形类型等不同在这里面存储的是自定义类型。 

最主要的问题就是在扩容时候的memcpy和delete。 

在reserve的时候,创造新空间和异地扩容都没问题。但是memcpy能有效的解决内置类型,却不能够解决自定义类型。 

再在下一步进行delete的时候,delete会释放那一段数据的空间。但是相比较free,delete删除数据会多做几步,delete[]它会指向的数组空间先调用析构函数,也就是调用string的析构函数。 

它就会将我们的数据进行析构,再把空间释放掉。 

因此如果T是自定义类型的时候,delete会依次调用数组每个对象析构函数,在释放整个空间。 

可以说这里是vector进行深拷贝,但是string还是浅拷贝的状态。 

那么要怎么去改写代码呢? 

在这个地方要进行修改,我们使用了一种常见的方式,它是将原先空间的值赋值到我们新空间当中

这样子后边delete之后就不会将数据析构掉。 

同样的在拷贝构造的地方我们也有使用到memcpy,这里也要对其进行修改。 

在这里我们对这个问题的解决方法是。

如果T是string这样的深拷贝的类,调用的是string赋值重载,实现的string对象的深拷贝。 

结尾:

到这里我们的vector板块的知识就告一段落了,在下一篇博客中我们将讲解C++的另外的知识,最后希望这篇博客能够带来一些帮助。 

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

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

相关文章

CentOS7在磁盘 Disk /dev/vdb 格式化为xfs, 创建逻辑卷saas,并挂载到/home/saas

CentOS7在磁盘 Disk /dev/vdb 格式化为xfs, 创建逻辑卷saas,并挂载到/home/saas CentOS7在磁盘 Disk /dev/vdb 格式化为xfs, 创建逻辑卷saas,并挂载到/home/saasCentOS7在磁盘 Disk /dev/vdb 格式化为xfs,并挂载到/ho…

关于安卓SVGA浅尝(一)svgaplayer库的使用

关于安卓SVGA浅尝(一)使用 相关链接 SVGA官网 SVGA-github说明文档 背景 项目开发,都会和动画打交道,动画的方案选取,就有很多选择。如Json动画,svga动画,gif等等。各有各的优势。目前项目中…

什么是浏览器的同源策略(same-origin policy)?它对AJAX有什么影响?

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ 浏览器的同源策略(Same-Origin Policy)⭐ 同源策略对AJAX的影响⭐ 写在最后 ⭐ 专栏简介 前端入门之旅:探索Web开发的奇妙世界 欢迎来到前端入门之旅!感兴趣的可以订阅本专栏哦!…

Mybatis 映射器中使用@InsertProvider,@UpdateProvider,@DeleteProvider,@SelectProvider

上一篇我们介绍了在Mybatis映射器的映射方法中使用Param接收多个参数;本篇我们继续介绍如何在Mybatis的映射器中使用动态SQL。 如果您对Mybatis映射器的映射方法中使用Param接收多个参数不太了解,建议您先进行了解后再阅读本篇,可以参考&…

iphone的safari浏览器实现全屏的pwa模式,并修改顶部状态栏背景颜色

要想修改顶部背景颜色&#xff0c;需要用到这个属性&#xff1a;content就是你要设置的颜色 <!-- 状态栏的背景色 --><meta name"theme-color" content"#f8f8f8" /> 然后再加上下面的设置&#xff1a; <!-- 网站开启对 web app 程序的支持…

DAZ To UMA⭐一.DAZ使用简介 / 设置DAZ导出的内容 / 获取模型纹理贴图

文章目录 🟥 DAZ快捷键🟧 DAZ界面介绍🟩 设置DAZ导出的内容1️⃣ 找到要导出的参数名称2️⃣ 打开导出面板3️⃣ 设置导出规则举例 : 导出身体Assets🟦 获取模型纹理贴图🟥 DAZ快捷键 移动物体:ctrl+alt+鼠标左键 旋转物体:ctrl+alt+鼠标右键 导入模型:双击左侧模型…

修改接口,字段的内容允许清空,避免歧义,参数校验:@NotNull

1. 问题描述 修改接口&#xff0c;字段的内容允许清空&#xff0c;是否应该做参数校验&#xff1f;如何做参数校验&#xff1f; 2. 说明 2.1. 需要对字段进行校验。 因为不校验&#xff0c;字段可能不传&#xff0c;或者字段的值为null&#xff1b;这样无法判断出&#xff…

Nginx是如何支持百万并发的?

通过源码分析Nginx的整体架构,以及进程模型。Nginx是一个免费的,开源的,高性能的HTTP服务器和反向代理。以其高性能,稳定性,丰富的功能,简单的配置和低资源消耗而闻名。Nginx是一个Web服务器,也可以用作负载均衡器和HTTP缓存。 很多高知名度的网站都使用Nginx,比如:N…

【线性代数】为什么 AA* = |A|E

A A ∗ 矩阵相乘&#xff0c;刚好是行列式展开的定义 AA*矩阵相乘&#xff0c;刚好是行列式展开的定义 AA∗矩阵相乘&#xff0c;刚好是行列式展开的定义 矩阵提取一个因子 ∣ A ∣ &#xff0c;所有元素需要除 ∣ A ∣ 矩阵提取一个因子 |A|&#xff0c;所有元素需要除 |A| 矩…

生信分析Python实战练习 9 | 视频27

开源生信 Python教程 生信专用简明 Python 文字和视频教程 源码在&#xff1a;https://github.com/Tong-Chen/Bioinfo_course_python 目录 背景介绍 编程开篇为什么学习Python如何安装Python如何运行Python命令和脚本使用什么编辑器写Python脚本Python程序事例Python基本语法 数…

视频编辑软件Premiere Pro 2022 mac(pr2023)v22.6.2中文功能

​Premiere Pro 2022 mac可以帮助用户对各种视频进行剪辑、旋转、分割、合并、字幕添加、背景音乐等基础的处理&#xff0c;pr2022还能帮助用户进行视频颜色校正、颜色分级、稳定镜头、调整层、更改片段的持续时间和速度、效果预设等操作。 Premiere Pro 22.1.2 包含版本 22.1.…

算法讨论题 —— Java实现两数之和

给定一个整数数组和一个目标值&#xff0c;找出数组中和为目标值的两个数。 你可以假设每个输入只对应一种答案&#xff0c;且同样的元素不能被重复利用。即:每个index上的数字只能用一次。 示例 给定 nums [2, 7, 11, 15], target 9 因为 nums[0] nums[1] 2 7 9 所以返…

汽车电子相关术语

SOA SOA&#xff08;Service-Oriented Architecture&#xff0c;面向服务的架构&#xff09;是一种在计算机环境中设计、开发、部署和管理离散模型的方法。是由Garnter1996年提出的概念&#xff0c;将应用程序的不同功能单元&#xff08;称为服务&#xff09;进行拆分&#xf…

高级运维学习(九)块存储、文件系统存储和对象存储的实现

块存储基础 块设备存取数据时&#xff0c;可以一次存取很多。字符设备只能是字符流 [rootceph1 ~]# ll /dev/sda brw-rw---- 1 root disk 8, 0 Dec 12 13:15 /dev/sda # b表示block&#xff0c;块设备[rootceph1 ~]# ll /dev/tty crw-rw-rw- 1 root tty 5, 0 Dec 12 13:31 /d…

springboot和vue:二、springboot特点介绍+热部署热更新

springboot特点介绍 能够使用内嵌的Tomcat、Jetty服务器&#xff0c;不需要部署war文件。提供定制化的启动器Starters&#xff0c;简化Maven配置&#xff0c;开箱即用。纯Java配置&#xff0c;没有代码生成&#xff0c;也不需要XML配置。提供了生产级的服务监控方案&#xff0…

git之撤销工作区的修改和版本回溯

有时候在工作区做了一些修改和代码调试不想要了,可如下做 (1)步骤1:删除目录代码,确保.git目录不能修改 (2)git log 得到相关的commit sha值 可配合git reflog 得到相要的sha值 (3)执行git reset --hard sha值,可以得到时间轴任意版本的代码 git reset --hard sha值干净的代…

七绝 . 秋寒

题记 拜读署名“淡定人生D”近日发表在“ 今日头条 ”上的古体诗《七绝 . 凉》&#xff0c;本老朽在由衷赞叹该女子才貌双全之时&#xff0c;也对自己寄居养老的成都崇州街子古镇今日下午的秋寒突至天气&#xff0c;情怀涌动&#xff0c;思绪万千&#xff0c;亦作《七绝 . 秋寒…

shell --- 基础篇

一、符号介绍 $#脚本的参数个数$*以一个单字符串显示所有脚本传递的参数$$当前进程ID号$!后台运行的最后一个进程的ID号$与$*相同&#xff0c;但是使用时加引号&#xff0c;并在引号中返回每个参数。$-显示Shell使用的当前选项&#xff0c;与set命令功能相同。$?显示最后命令…

【ComfyUI】安装 之 window版

文章目录 序言步骤下载comfyUI配置大模型和vae下载依赖组件启动 生成图片解决办法 序言 由于stable diffusion web ui无法做到对流程进行控制&#xff0c;只是点击个生成按钮后&#xff0c;一切都交给AI来处理。但是用于生产生活是需要精细化对各个流程都要进行控制的。 故也…

华为云云耀云服务器L实例评测|部署功能强大的办公套件 ONLYOFFICE

华为云云耀云服务器L实例评测&#xff5c;部署功能强大的办公套件ONLYOFFICE 一、云耀云服务器L实例介绍1.1 云服务器介绍1.2 支持镜像1.3 优势技术 二、云耀云服务器L实例配置2.1 重置密码2.2 服务器连接2.3 安全组配置 三、部署 ONLYOFFICE3.1 ONLYOFFICE 介绍3.2 Docker 环境…