Cherno C++学习笔记 P47 动态数组Vector

news2025/1/5 4:24:42

这一篇文章我们会介绍第一个标准模板库Standard Template Library当中的第一个容器,动态数组Vector。首先我们说一下有关于C++ STL,这些标准动态库为我们提供了各种容器来装我们的数据,根据我们有不同的需求,可以选择对应的容器。而且这些库都是模板库,也就是说什么类型的数据都可以装到里面去。但是如果只是使用STL,我们是不需要知道任何有关于模板类的知识的,我们只需要知道需要我们自己提供数据类型就可以了。

Vector本质上是一个动态数组容器,但是它的这个名字起的确实不是很合适,因为我们知道vector这个单词通常是用来表示向量的,但是C++ STL Vector确实和向量不能说是没有半毛钱关系,至少也是没什么相关性。所以就别纠结这个名字了,确实起的不合适。Vector与array相比,不同的地方在于,它可以随时调整大小。比如如果我们有一个长度为5的array,我们想要一个长度为6的,那么只能新建一个array,但是对于Vector,我们可以直接在后面多添加一个格子,那它就有6这么长了。

Vector是如何实现动态调整长度的?其实方式也是挺粗暴的。它的办法就是在我们需要添加新的格子的时候,去寻找新的更长的内存块,然后直接把原来内存里面的内容复制粘贴过去,然后再删除掉原来的内存里面的内容。这个其实并不是一个明智的选择,而且这也导致了STL Vector并不是我们可以选择的实现速度最快的Vector,很多时候我们都需要自己去实现。Cherno所在的EA就有EASTL,可以直接在GitHub上找到,有兴趣的朋友可以去看:https://github.com/electronicarts/EASTL

我们举一个例子来展示一下如何使用Vector,比如我们有这样一个Vertex类型:

struct Vertex {
    float x, y, z;
};

我们如果想要建立一个数组,可以使用原始数组:

Vertex a[5];

但是如果我们希望可以把数组长度设置为变量,比如说我们需要在程序运行期间才能够知道需要多少内存,那么我们使用变量来确定原始数组的长度就会报错:

int m = 4;
Vertex a[m];

这样的话是无法通过的。当然我们可以给原始数组直接分配一个超大的内存,来保障肯定不会超过内存,但是我们都知道这种办法会造成很大的内存浪费,而且看起来也很呆。那么这个时候我们就可以使用我们的vector容器了:

int b = 10;
std::vector<Vertex>vertices(b);

比如用这种办法,我们就可以轻松的通过变量来分配内存。

但是需要注意的一点是,这样分配是直接使用的vertex object本身。那么如果我们这么写:

std::vector<Vertex*>vertices(b);

分配的也就成了Vertex指针。所以应该是使用指针更好还是object本身更好?这个其实是一个看情况且不确定的问题。最开始的时候肯定是倾向于直接使用object本身的,因为这样的一个好处是所有的object内存都整齐的排列在一起,这样进行操作会更加容易,更好进行迭代。但是这样带来的一个问题就是,当我们要进行扩展的时候,我们需要申请到同样是连续的一段内存,然后把这部分数据拷贝到这部分内存当中,所以扩展起来会非常麻烦。如果是用的指针,那么扩展的时候只需要多分配给一个object的内存即可。但是如果用指针迭代,需要在内存里面跳来跳去,会影响性能,所以一般在有大量存储且有扩展需求的时候,我们一般更倾向于使用指针。但是通常使用中我们还是更多的会直接存储object。

接下来我们看看vertex的一些基本功能,首先是在后面添加一个新的项,通常我们会使用的是push_back方法,也是非常常用的vector的方法,功能就是给我们的vector末尾再添加一项。

Vertex plus = { 3,5,8 };
vertices.push_back(plus);

如果我们想要返回一个vector的长度,就直接使用size方法即可:

std::cout << vertices.size() << std::endl;

如果我们想要循环访问一个vector当中的所有元素,当然可以用i++ for循环这种常规方法:

for (int i = 0; i < vertices.size(); i++) {
}

 但是除了这个之外,我们还有可以使用range风格的for循环:

for (Vertex v: vertices) {
}

不过这个写法其实不好,因为我们会在每次循环的时候都产生一次复制粘贴,但是我们不希望有复制粘贴,所以可以改为引用:

for (Vertex& v: vertices) {
}

除此之外还有几个有用的function,一个是

vertices.clear();

可以直接把整个数组清空,size会被设为0;而如果我们想要删除某一个位置的值,那么需要使用erase功能。但是erase不能按照需要删除,如果想要删除,只能用迭代器的方式:

vertices.erase(vertices.begin() + 1);

这样我们就删掉了第二个迭代器指向的内容。

以上就是有关于vector的一些基础知识了,后面我们会讲到如何提高我们vector的运行速度。

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

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

相关文章

简易屏幕共享工具-基于WebSocket

前面写了两个简单的屏幕共享工具&#xff0c;不过那只是为了验证通过截屏的方式是否可行&#xff0c;因为通常手动截屏的频率很低&#xff0c;而对于视频来说它的帧率要求就很高了&#xff0c;至少要一秒30帧率左右。所以&#xff0c;经过实际的截屏工具验证&#xff0c;我了解…

python-leetcode-多数元素

169. 多数元素 - 力扣&#xff08;LeetCode&#xff09; class Solution:def majorityElement(self, nums: List[int]) -> int:candidate Nonecount 0for num in nums:if count 0: # 更新候选元素candidate numcount (1 if num candidate else -1)return candidate

js按日期按数量进行倒序排序,然后再新增一个字段,给这个字段赋值 10 到1

效果如下图&#xff1a; 实现思路&#xff1a; 汇总数据&#xff1a;使用 reduce 方法遍历原始数据数组&#xff0c;将相同日期的数据进行合并&#xff0c;并计算每个日期的总和。创建日期映射&#xff1a;创建一个映射 dateMap&#xff0c;存储每个日期的对象列表。排序并添加…

MM-2024 | 智能体遇山开路,遇水架桥! ObVLN:突破障碍,受阻环境中的视觉语言导航

作者&#xff1a;Haodong Hong, Sen Wang, Zi Huang 单位&#xff1a;昆士兰大学 论文链接&#xff1a;Navigating Beyond Instructions: Vision-and-Language Navigation in Obstructed Environments (https://dl.acm.org/doi/pdf/10.1145/3664647.3681640) 代码链接&#…

1Panel自建RustDesk服务器方案实现Windows远程macOS

文章目录 缘起RustDesk 基本信息实现原理中继服务器的配置建议 中继服务器自建指南准备服务器安装1Panel安装和配置 RustDesk 中继服务防火墙配置和安全组配置查看key下载&安装&配置客户端设置永久密码测试连接 macOS安装客户端提示finder写入失败hbbs和hbbr说明**hbbs…

Tube Qualify弯管测量系统在汽车管路三维检测中的应用

从使用量上来说&#xff0c;汽车行业是使用弯管零件数量最大的单一行业。在汽车的燃油&#xff0c;空调&#xff0c;排气&#xff0c;转向&#xff0c;制动等系统中都少不了管路。汽车管件形状复杂&#xff0c;且由于安装空间限制&#xff0c;汽车管件拥有不同弯曲半径&#xf…

Excel文件恢复教程:快速找回丢失数据!

Excel文件恢复位置在哪里&#xff1f; Excel是微软开发的电子表格软件&#xff0c;它为处理数据和组织工作提供了便捷。虽然数据丢失的问题在数字时代已经司空见惯&#xff0c;但对于某些用户来说&#xff0c;恢复未保存/删除/丢失的Excel文件可能会很困难&#xff0c;更不用说…

R语言入门笔记:第一节,快速了解R语言——文件与基础操作

关于 R 语言的简单介绍 上一期 R 语言入门笔记里面我简单介绍了 R 语言的安装和使用方法&#xff0c;以及各项避免踩坑的注意事项。我想把这个系列的笔记持续写下去。 这份笔记只是我的 R 语言入门学习笔记&#xff0c;而不是一套 R 语言教程。换句话说&#xff1a;这份笔记不…

16、【ubuntu】【gitlab】【补充】服务器断电后,重启服务器,gitlab无法访问

背景 接wiki 【服务器断电后&#xff0c;重启服务器&#xff0c;gitlab无法访问】https://blog.csdn.net/nobigdeal00/article/details/144280761 最近不小心把服务器重启&#xff0c;每次重启后&#xff0c;都会出现gitlab无法访问 分析 查看系统正在运行的任务 adminpcad…

汇编环境搭建

学习视频 将MASM所在目录 指定为C盘

两种分类代码:独热编码与标签编码

目录 一、说明 二、理解分类数据 2.1 分类数据的类型&#xff1a;名义数据与序数数据 2.2 为什么需要编码 三、什么是独热编码&#xff1f; 3.1 工作原理&#xff1a;独热编码背后的机制 3.2 应用&#xff1a;独热编码的优势 四、什么是标签编码&#xff1f; 4.1 工作原理&…

二、SQL语言,《数据库系统概念》,原书第7版

文章目录 一、概览SQL语言1.1 SQL 语言概述1.1.1 SQL语言的提出和发展1.1.2 SQL 语言的功能概述 1.2 利用SQL语言建立数据库1.2.1 示例1.2.2 SQL-DDL1.2.2.1 CREATE DATABASE1.2.2.2 CREATE TABLE 1.2.3 SQL-DML1.2.3.1 INSERT INTO 1.3 用SQL 语言进行简单查询1.3.1 单表查询 …

异常与中断(下)

文章目录 一、中断的硬件框架1.1 中断路径上的3个部件1.2 STM32F103的GPIO中断1.2.1 GPIO控制器1.2.2 EXTI1.2.3 NVIC1.2.4 CPU1. PRIMASK2. FAULTMASK3. BASEPRI 1.3 STM32MP157的GPIO中断1.3.1 GPIO控制器1.3.2 EXTI1. 设置EXTImux2. 设置Event Trigger3. 设置Masking4. 查看…

「Mac畅玩鸿蒙与硬件48」UI互动应用篇25 - 简易购物车功能实现

本篇教程将带你实现一个简易购物车功能。通过使用接口定义商品结构&#xff0c;我们将创建一个动态购物车&#xff0c;支持商品的添加、移除以及实时总价计算。 关键词 UI互动应用接口定义购物车功能动态计算商品管理列表操作 一、功能说明 简易购物车功能包含以下交互&#…

STM32学习之EXTI外部中断(以对外式红外传感器 / 旋转编码器为例)

中断:在主程序运行过程中&#xff0c;出现了特定的中断触发条件(中断源)&#xff0c;使得CPU暂停当前正在运行的程序&#xff0c;转而去处理中断程序处理完成后又返回原来被暂停的位置继续运行 中断优先级:当有多个中断源同时申请中断时&#xff0c;CPU会根据中断源的轻重缓急…

如何使用 ChatGPT Prompts 写学术论文?

第 1 部分:学术写作之旅:使用 ChatGPT Prompts 进行学术写作的结构化指南 踏上学术写作过程的结构化旅程,每个 ChatGPT 提示都旨在解决特定方面,确保对您的主题进行全面探索。 制定研究问题: “制定一个关于量子计算的社会影响的研究问题,确保清晰并与您的研究目标保持一…

HuatuoGPT-o1:基于40K可验证医学问题的两阶段复杂推理增强框架,通过验证器引导和强化学习提升医学模型的推理能力

HuatuoGPT-o1&#xff1a;基于40K可验证医学问题的两阶段复杂推理增强框架&#xff0c;通过验证器引导和强化学习提升医学模型的推理能力 论文大纲理解1. 确认目标2. 分析过程3. 实现步骤4. 效果展示 解法拆解全流程提问俩阶段详细分析 论文&#xff1a;HuatuoGPT-o1, Towards …

07-计算机网络面试实战

07-计算机网络面试实战 计算机网络面试实战 为什么要学习网络相关知识&#xff1f; 对于好一些的公司&#xff0c;计算机基础的内容是肯定要面的&#xff0c;尤其是 30k 以内的工程师&#xff0c;因为目前处于的这个级别肯定是要去写项目的&#xff0c;还没上升到去设计架构的高…

Github - 如何提交一个带有“verified”标识的commit

Github - 如何提交一个带有“verified”标识的commit 前言(Why) 今天在Github上浏览某项目的commit记录的时候发现&#xff0c;有的commit记录带有verified绿色标识&#xff0c;有的带有橘色的Unverified标识&#xff0c;还有的什么都不显示。 既然我是根正苗红的作者(bushi)…

中式美学|中国红电商展台咒语分享

使用工具&#xff1a;千鹿AI 咒语&#xff1a;geometric shape podium,Red background, and rose gold elements on the right side, Chinese New Year atmosphere, simple and clean light luxury scene, minimalist style, minimalist stage design, studio lighting, minim…