c++:vector

1.使用

1.1构造函数

常见的三种构造方式:空构造,拷贝构造,指定元素构造

1.2iterator

begin和end也分为正向和反向。

注意:反向迭代器可以反向遍历是因为在定义rbegin和rend函数的时候把尾地址给到了rbegin,而不是说改个reverse_iterator就可以这么简单

1.3空间

(1)resize:可以用于确定元素个数的初始化,以及插入n个相同元素

(2)reserve:可以扩充数组容量

这是扩容前,我们看到它的空间容量是15

这扩容后,它的空间容量是30

1.4获取首尾数据

front:获取首数据,back获取尾元素

因为front取得是首元素,所以我们这里把首元素改成2,back取得是尾元素。所以这里我们把尾元素改成3

1.5简单讲解emplace

2.动态二维数组理解

静态的二维数组其实是先把划给数组的空间分为几大块,有几行就分几块,然后在每块里面再细分出来给具体的元素存储。

而动态的二维数组是先弄一个数组存每行的地址,这个地址是动态开辟的数组的地址,这个动态开辟的数组存的才是数据

3.迭代器的分类

1.单向迭代器:支持迭代器++

eg:

2.双向迭代器:支持++,--

eg:

3.随机迭代器:支持++,--,=,-

eg:

4.底层部分实现

4.1基础结构搭建

(1)因为我们需要利用迭代器实现vector和算法的链接,所以先把迭代器typedef出来,对于数组结构,对应数据的指针就可以实现迭代器的功能

(2)之前的数组我们都是使用索引去访问数据,这里也是为了和算法接上,所以改成迭代器的形式,m_start表示首元素的迭代器位置,m_finish表示尾元素的下一个位置的迭代器位置。m_end_of_storage表示空间边界的下一个位置

4.2迭代器构建

首先是需要typedef出iterator,因为对于数组这个数据结构指针就可以充当迭代器实现访问。

然后我们把begin()和end()的值给上

4.3reserve实现 

因为我们不实现缩容,所以这里我们需要知道capacity是多少,且后面的实现还需要知道有效数据个数,所以我们先把这两个功能实现一下

1.capacity

2.size

接下来实现reserve

首先判断是否满足指定的容量值大于当前容量值,若大于则开始进行扩容。

扩容:

1.根据val创建新的空间

2.拷贝对应值

3.释放旧空间

4.更新数组内置三个迭代器的值

但是这里会有个大问题:m_finish的指向会有问题

因为此时调用size,用的是旧的m_finish和新的m_start相减,m_start已经是指向新开辟的空间的迭代器,与m_finish八竿子打不着。我们有两种解决方式

方法一:换顺序

调换赋值顺序,我们把m_finish的赋值和m_start的赋值顺序换一下,这样就可以用旧的m_start和旧的m_finish相减,从而得到正确的size大小

方法二:变量存值

在扩容前,先用一个oldsize存储旧的size,后面赋值就不再调用size,而是直接使用oldsize。

方法二要比方法一更好,因为你无法保证其他程序员会不会去动你的代码顺序。

方法二实现


补充:由于实现模板需要考虑到各种数据类型,所以我们的reserve其实不能使用memcpy来实现数据拷贝,因为他是一个一个字节去拷贝的,实现的是浅拷贝。

对于需要深拷贝的我们应该实现深拷贝

这里对于内置类型则与之前没区别,但是对于自定义类型就可以调用赋值重载来实现深拷贝了

4.4尾插与尾删

 尾插前判断容量是否足够,如果不足就reserve,不过也要考虑到capacity为0的情况,若为0就给四个字节空间,否则就按照原本空间两倍来开

插入数据就直接解引用给值即可。


4.5 任意位置插入

第一步:容量判断与扩容

第二步:挪动数据

第三步:插入数据并更新迭代器


注意:insert在需要扩容的情况下会出现迭代器失效的问题!!!

因为扩容后m_start和m_finish变位置了,而pos还是旧的位置,所以while循环会出问题。

我们应该在扩容完成前把旧的pos和start之间的距离保存下来,然后更新pos位置,用新的pos进行while判断

还有一个要注意的是,我们既然利用了迭代器去访问数据,就用上解引用符号来访问


一旦我们使用了insert或erase这些用了迭代器的方法之后,默认这个迭代器就失效了,不能接着使用,但是begin()和end()还是可以的

4.6删除

 

第一步:挪动数据,从pos的下一个位置开始挪动,直到最后一个位置的元素也挪动完为止

第二步:更新迭代器

4.7resize实现

 

总共分两种情况:删除和插入

删除:需要的size大小比原来的size还小,所以删除,把m_finish更新一下即可

插入:需要的size大小比原来的size还大,所以插入,无论是否需要扩容,我们先reserve,对于需要扩容的reserve会自动扩,不用的则不会有任何操作。然后进行插入,直到到达目标size

4.8构造函数

(1)普通构造 注意:如果我们写了任意一个构造函数,系统就不会再给我们自动实现默认构造了

 (2)拷贝构造

我们对于含有指针等类型的自定义类型需要实现深拷贝,而这里我们实现的是vector的模板,所以要考虑到这一点。

直接遍历然后尾插即可,不过因为尾插会涉及很多次扩容,效率较低,所以我们先提前用reserve开好空间


(3)数值直接传递的构造

在说这个构造之前我们先了解一下initializer_list这个类。

他和数组的使用很类似,不过他的类只支持begin,end和size三个方法。

和拷贝构造的实现方法类似,不再重复说明

使用:

这样我们就可以实现传递多个值的构造函数


(4)迭代器区间初始化

由于我们利用迭代器区间初始化的时候不仅仅是使用自己这个类的迭代器,而是适用于所有类型的迭代器,所以这里我们创建一个迭代器模板,以此兼容所有迭代器。


(5)n个数值构造

疑问:为什么我们要实现两个方法?

因为第一个方法在一种常见的情况下会出问题,导致匹配的构造方法是迭代器区间的构造方法。

这里我们的两个数据都是int型,而如果只实现第一个方法,在匹配度上就不如迭代器区间构造的匹配度,所以会调用迭代器区间初始化,造成非法间接寻址

所以我们多重载一个构造函数就可以解决这个问题

4.9赋值重载

 

我们实现的是赋值重载的现代写法,在传参的时候就已经利用拷贝构造构建出了一个和赋值的数组内容一样的数组,我们直接把被赋值数组和新创建的数组的内容换掉就可以实现赋值功能了。

在这里我们用到了swap

由于vector中就只包含三个变量,所以我们把这三个迭代器都交换就行了

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

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

相关文章

1.27补题 回训练营

E 智乃的小球 题目描述 在一条无限长的水平直线上,有 n 个小球,每个小球的质量相同,体积可以忽略不计。这些小球初始时位于直线上的不同位置,并且每个小球有一个初始速度,速度为 -1 m/s 或 1 m/s。速度为 -1 m/s 表示…

Hive安装教程

Hive安装教程 文章目录 Hive安装教程写在前面安装下载安装部署安装Hive启动并使用Hive MySQL安装检查当前系统是否安装过MySQL安装初始化数据库 Hive元数据配置到MySQL拷贝驱动配置Metastore到MySQL再次启动Hive 写在前面 Linux版本:CentOS7.5Hive版本:…

大屏 UI 设计风格的未来趋势

在科技飞速革新的时代,大屏设备的应用领域不断拓展,从城市的智能交通指挥中心,到商场的互动广告大屏,再到家庭的超大尺寸智能电视,大屏已然成为信息展示与交互的关键载体。大屏 UI 设计风格也随之不断演变,…

元素的显示与隐藏

display显示隐藏visibility显示隐藏overflow溢出显示隐藏 display属性 visibility属性 overflow溢出

Unity游戏(Assault空对地打击)开发(1) 创建项目和选择插件

目录 前言 创建项目 插件导入 地形插件 前言 这是游戏开发第一篇,进行开发准备。 创作不易,欢迎支持。 我的编辑器布局是【Tall】,建议调整为该布局,如下。 创建项目 首先创建一个项目,过程略,名字请勿…

网络工程师 (7)进程管理

一、进程相关的概念 (一)定义 进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,也是操作系统结构的基础。进程是程序的一次执行实例,具有动…

使用CSS实现一个加载的进度条

文章目录 使用CSS实现一个加载的进度条一、引言二、步骤一:HTML结构与CSS基础样式1、HTML结构2、CSS基础样式 三、步骤二:添加动画效果1、使用CSS动画2、结合JavaScript控制动画 四、使用示例五、总结 使用CSS实现一个加载的进度条 一、引言 在现代网页…

ios swift画中画技术尝试

继上篇:iOS swift 后台运行应用尝试失败-CSDN博客 为什么想到画中画,起初是看到后台模式里有一个picture in picture,去了解了后发现这个就是小窗口视频播放,方便用户执行多任务。看小窗口视频的同时,可以作其他的事情…

论文阅读(二):理解概率图模型的两个要点:关于推理和学习的知识

1.论文链接:Essentials to Understand Probabilistic Graphical Models: A Tutorial about Inference and Learning 摘要: 本章的目的是为没有概率图形模型背景或没有深入背景的科学家提供一个高级教程。对于更熟悉这些模型的读者,本章将作为…

【C++】特殊类设计

目录 一、请设计一个类,不能被拷贝二、请设计一个类,只能在堆上创建对象三、请设计一个类,只能在栈上创建对象四、请设计一个类,不能被继承五、请设计一个类,只能创建一个对象(单例模式)5.1 饿汉模式5.2 懒汉模式 结尾…

SSM开发(七) MyBatis解决实体类(model)的字段名和数据库表的列名不一致方法总结(四种方法)

目录 方法一: 使用@Results和@Result注解(注解方式) 方法二:修改 SQL 查询语句中的别名(注解方式) 方法三: 全局配置别名或结果映射(resultMap,XML配置方式) 方法四:使用@Column注解 在MyBatis中,如果你希望使用注解的方式来操作数据库,但又遇到实体类中的…

USB 3.1-GL3510-52芯片原理图设计

USB 3.1-GL3510-52芯片原理图设计 端口功能与兼容性物理层集成与性能电源相关特性充电功能其他特性原理图接口防护ESD 保护要求 GL3510-52是一款由Genesys Logic(创惟科技)研发的USB转换芯片,具有以下特点: 端口功能与兼容性 它…

LeetCode热题100中 17. 20. 53. 78. 215.

17.电话号码的字母组合: 题目描述: 实现思路: 将回溯过程抽象成树结构,每个叶子节点作为结果的一部分。 我们定义一个数组map,它的下标表示输入的数字所对应的字母,先对特殊情况进行处理:1.输…

高级编码参数

1.跳帧机制 参考资料:frameskipping-hotedgevideo 跳帧机制用于优化视频质量和编码效率。它通过选择性地跳过某些帧并使用参考帧来预测和重建视频内容,从而减少编码所需的比特率,同时保持较高的视频质量。在视频编码过程中,如果…

内网穿透实现MC联机

目录 内网穿透下载安装服务端(你)启动网络启动 MC 客户端(你的朋友) 放寒假了,想和同学玩mc,但是没有服务器怎么办呢?这就不得不提到内网穿透技术了。 注:本文参考视频:…

【每日一A】2015NOIP真题 (二分+贪心) python

题目概述 在起点和终点之间有n个石头,移除某些(不超过m个)石头后,让石头间的距离最大。 求石头间的最短距离d的最大值 跳石头 点此跳转 https://www.lanqiao.cn/problems/364/learning/?page1&first_category_id1&status…

获取snmp oid的小方法1(随手记)

snmpwalk遍历设备的mib # snmpwalk -v <SNMP version> -c <community-id> <IP> . snmpwalk -v 2c -c test 192.168.100.201 .根据获取的值&#xff0c;找到某一个想要的值的oid # SNMPv2-MIB::sysName.0 STRING: test1 [rootzabbix01 fonts]# snmpwalk -v…

FreeRTOS从入门到精通 第十四章(队列集)

参考教程&#xff1a;【正点原子】手把手教你学FreeRTOS实时系统_哔哩哔哩_bilibili 一、队列集简介 1、队列集概述 &#xff08;1&#xff09;一个队列只允许任务间传递的消息为同一种数据类型&#xff0c;如果需要在任务间传递不同数据类型的消息时&#xff0c;那么就可以…

Spring MVC 综合案例

目录 一. 加法计算器 1. 准备工作 2. 约定前后端交互接口 需求分析 接口定义 3. 服务器端代码 4. 运行测试 二. 用户登录 1. 准备工作 2. 约定前后端交互接口 需求分析 接口定义 (1) 登录界面接口 (2) 首页接口 3. 服务器端代码 4. 运行测试 三. 留言板 1. 准备…

Edge-TTS在广电系统中的语音合成技术的创新应用

Edge-TTS在广电系统中的语音合成技术的创新应用 作者&#xff1a;本人是一名县级融媒体中心的工程师&#xff0c;多年来一直坚持学习、提升自己。喜欢Python编程、人工智能、网络安全等多领域的技术。 摘要 随着人工智能技术的快速发展&#xff0c;文字转语音&#xff08;Te…