【高级程序设计语言C++】vector的使用及模拟实现

  • 1. vector概述
  • 2. vector的数据结构
    • 2.1. vector的模拟实现
    • 2.2. vector的构造函数
    • 2.3. vector 的扩容
  • 3. vector的增删查改
    • 3.1. 增
    • 3.2. 删
    • 3.3. 查
    • 3.4. 改
  • 4. 总结

1. vector概述

vector是动态空间,随着元素的加入,它的内部机制会自动扩充空间以容纳新元素。因此,vector的运用对于内存的合理利用与运用的灵活性有很大的帮助,我们可以安心使用vector,吃多少用多少。

vector其实就是动态的顺序表,它是在管理数组,并且它是一个类模板,可以实例化为不同类型的类,来供我们使用。其中STL标准模板库给我们提供了很多的成员函数接口来供我们使用,使我们编程的效率大大提高。本篇文章将会介绍如何使用vector,还有vector的底层原理,并且对其进行一个简单的模拟实现。

2. vector的数据结构

vector所采用的数据结构非常简单:线性的连续空间。它以两个迭代器start和finish分别指向配置得来的连续空间中目前已被使用的范围,并以迭代器end_of_storage指向整块连续空间的尾端。

为了降低空间配置时的速度成本,vector实际配置的大小可能比客户端需求量更大一些,以备将来可能的扩充,这边是容量(capacity)的概念。换句话说,一个vector的容量永远大于或等于其大小。一旦容量等于大小,便是满载,下次再有新增元素,整个vector就得另觅居所。如下图所示img

2.1. vector的模拟实现

SGI版本的源码可以看到vector的成员变量就只有三个,start,finish, end_of_storage.

img

还有一些typedef声明如下。

img

2.2. vector的构造函数

img

根据官方文档给出的几个构造函数,本人这里对其进行了模拟,忽略空间配置器,代码如下。

img

img

img

img

2.3. vector 的扩容

关于vector的扩容,所谓的动态增加大小,并不是在原空间之后接续新空间(因为无法保证原空间后还有可用的空间),而是以原大小的两倍另外配置一块较大空间,然后将原内容拷贝过来,然后才开始在原内容之后构造新元素,并释放原空间。

vector的扩容机制涉及到两个函数,如下图。

img

img

它们的模拟实现具体如下:

imgimg

过程如下图所示:

img

3. vector的增删查改

3.1. 增

vector常要的新增元素的接口是push_back 和 insert两个。

imgimg

push_back的模拟实现如下图所示:

img

insert的模拟实现如下图所示:

img

关于insert这里要注意迭代器的问题。

img

在不涉及到扩容的时候,插入元素是没有任何问题的。

img

但设计到了扩容问题,迭代器就可能会有失效的问题。

imgimg

我们看到运行结果是没问题,但是我们要考虑到异地扩容的问题。

在上面讲过扩容问题的时候,会涉及到异地扩容的问题,所以在insert里是对pos迭代器做了更新处理的。假如没有做处理的话,pos会有野指针的问题。

那上面运行的结果没问题也不代表迭代器没有问题,我们拿it来读取一下看看。

img

img

可以看到运行结果的返回值不是0,代表运行出错了。

3.2. 删

删常用的接口是erase和pop_back。

imgimg

erase的模拟实现如下图所示:

img

pop_back的模拟实现如下所示:

img

同样的,在vector进行erase的时候也是会存在迭代器失效的问题的。

imgimg

就是在删除之后,我继续对原来迭代器进行读取,发现代码是运行错误的,也就是迭代器失效了。

但是如果说,我还是要在原来迭代器的位置进行操作,我该怎么办呢?

如果是这样的话,可以用一个迭代器来接收新的返回值或者做更新处理,然后进行操作。

如下所示,这样的运行结果就是正确的了。

imgimg

vector不管新增还是删除,默认迭代器都是失效的,如果想在原来迭代器的位置进行操作,可以用返回值来进行相应的操作。

3.3. 查

对于vector常见的查接口就是[]和front和back。

img

实际就是我们常用的数组访问元素的[],具体模拟实现如下。

img

img

img

front这个接口就是访问数组的第一个元素,类似a[0]。

img

back就是直接返回数组的最后一个元素。

img

img

img

3.4. 改

这个介绍一个不常用的接口,assign。

img

img

img

4. 总结

通过对vector的简单模拟实现,以及查看stl源码,可以很好的了解vector的底层原理,以及了解vector的优缺点,从而更好的使用官方提供的模板库。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

鸿蒙系统编译方式

鸿蒙系统编译 编译原理编译方式概述hb编译ohos-buildhb安装编译使用build脚本hpmhpm介绍编译举例说明综合应用举例虚拟机中编译docker中使用hpm编译编译原理 编译构建指导:https://docs.openharmony.cn/pages/v4.0/zh-cn/device-dev/subsystems/subsys-build-all.md,文档介绍…

Comau柯马机器人维修故障分类

在柯马机器人的使用过程中,常见的是Comau机械手减速器故障。那么,我们一起来探讨一下柯马机械臂维修减速机故障的问题。Comau工业机械手减速器故障分类 1. 异响 机器人在工作过程中发出异常声响,可能是柯马机械臂减速器内部磨损或零件松动引起…

阿赵UE引擎C++编程学习笔记——解决中文乱码问题

大家好,我是阿赵。   在UE编写C的时候,可能有些朋友发现,在C里面如果打印输出或者赋值一些中文的字符串的时候,会出现各种的报错,要么乱码,要么直接编译不过。   这个问题,其实和UE本身没什…

嵌入式中STM32上模拟启动Linux自动初始化

Linux中有很多编程思想可以学习,很多大佬把这些思想、机制运用到单片机的编程上。 下文,在STM32上模拟Linux kernel自动初始化流程。 通常我们写程序都是按照这个套路,一个函数一个函数按照顺序逻辑一个一个的执行下去。 如果逻辑非常复杂,涉及的模块比较多,那么这种顺…

Visual Studio使用——vs解决方案显示所有文件

目录 引出vs解决方案显示所有文件Idea安装和使用0.Java下载 和 IDEA工具1.首次新建项目2.隐藏文件不必要显示文件3.目录层级设置4.Settings设置选择idea的场景提示代码不区分大小写 取消git的代码作者显示 总结 引出 Visual Studio使用——自定义代码片段 & 像使用IDEA一样…

LNG船气体监测系统中甲烷传感器的应用

随着全球能源结构的转型和环保意识的增强,液化天然气(LNG)作为清洁、高效的能源,其运输需求日益增长。LNG船作为专门用于运输液化天然气的特种船舶,其安全性和可靠性直接关系到能源供应的稳定性和环境保护的有效性。在…

windows下安装redis

正常生产我们会在Linux下安装redis,windows下安装redis只做依赖环境的快速搭建、项目的快速验证。 1、下载地址 Releases microsoftarchive/redis GitHub 下载 Redis-x64-3.0.504.zip 2、解压文件夹 解压到本地某个文件夹下,比如 D:\redis-3.0.504 3…

Compose容器编排示例

前言:本博客仅作记录学习使用,部分图片出自网络,如有侵犯您的权益,请联系删除 目录如下: 一、从源代码开始构建、部署和管理应用程序 1.1、创建项目目录并准备应用程序的代码及其依赖 1.2、创建Dockerfile 1.3、在…

GD32驱动LCD12864

目录 1、引言 1.1、LCD12864基本概念和作用。 1.2、硬件引脚 2、GD32微控制器简介 3、LCD12864显示屏简介 3.1、模块引脚说明 3.2、模块连接方式 4、驱动原理 4.1、指令集 4.2、显示坐标关系 5、软件开发 6、硬件连接 7、效果演示 8、附录 1、引言 1.1、LCD12…

C语言 | Leetcode C语言题解之第88题合并两个有序数组

题目: 题解: void merge(int* nums1, int nums1Size, int m, int* nums2, int nums2Size, int n) {int p1 m - 1, p2 n - 1;int tail m n - 1;int cur;while (p1 > 0 || p2 > 0) {if (p1 -1) {cur nums2[p2--];} else if (p2 -1) {cur nu…

sudo apt-get update失败,怎么解决

本篇文章主要是从我的解决方案出发,因为个体差异性,对大家的帮助可能有限,不过大家也可以作为参考之一。 输入sudo apt-get update,结果一直显示: W: 无法下载 http://mirrors.aliyun.com/ubuntu/dists/jammy-securi…

今日早报 每日精选15条新闻简报 每天一分钟 知晓天下事 5月14日,星期二

每天一分钟,知晓天下事! 2024年5月14日 星期二 农历四月初七 1、 两部门:2024年全国计划招聘“特岗计划”教师3.7万名。 2、 人社部:2024年“三支一扶”计划拟招募3.44万名高校毕业生。 3、 财政部:5月17日、5月24日…

Nios实验入门——用Verilog编程方式完成LED流水灯显示并使用串口输出“Hello Nios-II”字符到笔记本电脑

文章目录 前言一、Verilog编程方式完成LED流水灯显示1.1 新建工程并添加FPGA芯片1.2 新建.v文件并添加至顶层实体1.3 引脚分配1.4 编译(包含分析与综合)1.5 选择烧录器1.6 添加烧录文件1.7 下载1.8 实验现象 二、Verilog编程方式实现串口2.1 uart_tx.v文件2.2 test.v文件2.3 to…

Linux x86_64 dump_stack()函数基于FP栈回溯

文章目录 前言一、dump_stack函数使用二、dump_stack函数源码解析2.1 show_stack2.2 show_stack_log_lvl2.3 show_trace_log_lvl2.4 dump_trace2.5 print_context_stack 参考资料 前言 Linux x86_64 centos7 Linux:3.10.0 一、dump_stack函数使用 dump_stack函数…

LeetCode 力扣题目:买卖股票的最佳时机 III

❤️❤️❤️ 欢迎来到我的博客。希望您能在这里找到既有价值又有趣的内容,和我一起探索、学习和成长。欢迎评论区畅所欲言、享受知识的乐趣! 推荐:数据分析螺丝钉的首页 格物致知 终身学习 期待您的关注 导航: LeetCode解锁100…

Autosar架构

蓝框那种叫component,绿框的叫function cluster。 接口 有三种接口,RTE跟SWC之间链接的叫Autosar Interface,RTE跟BSW的Components链接是Standardized Interface,RTE跟BSW的services链接的是Standardized Autosar Interface。 St…

C语言 8 函数递归

目录 1. 递归是什么? 2.递归的限制条件 3. 递归举例1 4. 递归举例2 5.迭代 6. 递归举例3 拓展学习: 1. 递归是什么? 递归是学习C语⾔函数绕不开的⼀个话题,那什么是递归呢? 递归其实是⼀种解决问题的⽅法&#xff0c…

【Spring】Springmvc学习Ⅲ

# Springmvc学习Ⅲ 文章目录 一、图书管理系统1. 功能1.1 登录前端接口前端代码后端接口后端代码 1.2 图书列表展示步骤:图书类代码mock数据代码控制层调用代码服务层代码(存储除数据库中需要存储的数据) 2. 分层控制2.1 三层架构2.2 代码重…

Softing dataFEED OPC Suite通过OPC UA标准加速数字化转型

数字化转型的关键在于成功将信息技术(IT)与运营技术(OT)相融合,例如将商业应用程序和服务器与可编程逻辑控制器(PLC)和设备传感器相融合,为此,各种设备和系统必须能够相互…

【Day1:JAVA导学】

目录 1、path环境变量2、Java背景介绍2.1 Java SE:2.2 Java ME:2.3 Java EE: 3、Java的跨平台性3.1 Java跨平台的原理: 4、Java开发程序的三个步骤5、JDK的组成和配置5.1 JDK的组成: 6、IDEA项目结构介绍7、Java关键字…