C++——vector

news2024/10/6 22:32:26

作者:几冬雪来

时间:2023年9月12日

内容:C++部分vector知识讲解

目录

前言: 

1.vector: 

1.vector的本质:

2.vector书写: 

vector创建空间: 

vector与reserve和vector和resize:

头插/头删及其衍生:

结尾: 


前言: 

迄今为止我们的C++已经学习了许多的板块了,并且越到后面学习的知识可以也是会越抽象和困难,但是这并不代表着我们不能将其学会。今天就来讲解C++部分的vector知识。

1.vector: 

要学习vector,就要先了解vector是什么?

它的本质是什么

1.vector的本质:

在我们的C++中,vector象征着向量

它的行为和数组基本是一样的,唯一不同的是vector可以动态增长,也就是在插入数据的时候可以进行扩容操作。 

而我们的vector放在string的后面进行讲解,二者之间肯定有着一些联系。 

那我们的vector好string之间,到底有着什么联系呢?二者又有什么相似的地方和不一样的地方?下面我会对其一一进行讲解

2.vector书写: 

在了解完了vector的本质之后,要想对其进一步的了解。将其代码写出来是必不可少的操作。

接下来我们就先简单的书写一段vector的代码。

这里就是我们的vector的简单的代码。

运行结果也和我们string代码的结果一样。 

在学习过string之后,看vector代码可谓十分的眼熟。大家如果会使用string的话,vector可谓手到擒来。 

但是并不是学会string就可以书写vector的代码,二者虽然格式差不多,但是也有不同的地方

而且在书写代码的时候特别要注意一个点

虽然二者的格式和写法差不多,但是在真正写代码的时候。我们不能用vector去代替string

最本质的区别就是:

string在一开始初始化的时候,它是会自动处理‘\0’的。而vector则是需要我们手动对其进行处理

因为这个原因,vector并不能做到和C语言兼容,这就是它们二者根本的区别。

并且string的一些接口对于vector来说是没有意义的。 

输入根据什么所说,vector和string并不能相互代替。但是我们可以将string存放到vector之中,也可以在vector中存vector,这样做的话就是二维数组了

vector创建空间: 

记得我们曾经使用string创建了空间,并对其进行了初始化。

那么这里的vector又是怎么书写的,下面就来看一下代码

用代码来实现空间的创建和初始化。 

通过上面的代码我们可以通过vector对空间进行创建和初始化。 

同样的vector也可以也迭代器进行套用。 

vector与reserve和vector和resize:

接下来就来讲解一下reserve接口。

reserve经常被用于string板块开辟空间,但是在vector下,我们的reserve接口却不适用,这里面有一个十分重要的原因。

这里先看一下代码。

使用完了reserve扩容空间之后,要想对空间赋值的话,可以使用for循环然后再在for循环里面嵌套一个“[]”(方括号)进行赋值。 

但是在这里,string能使用的接口,vector却不能使用。而问题就出在“[]”处。 

reserve是减少扩容的消耗

但是在运用到vector中却会出现问题。 

因为“[]”的缘故,我们要访问的是有效值,因此在开始部分会添加assert进行判断

而在没有进行赋值之前,_size的大小为0,所以在这个地方代码会因为assert的原因而无法运行

如果这个地方我们想去访问的话,应用的不应该是reserve,而是resize。 

同样是开辟空间,resize将空间开辟好了之后,_size也会移动而不是还在0处,这样子assert的判断就可以通过。 

但是并不是指reserve接口不能和vector配套使用,只是在使用的时候不能写得和string时候的代码一样

那如果要用reserve的话,代码又应该怎么写呢?

如果要使用的话,这里需要更改的是“[]”,将“[]”更改为push_back来插入数据,而不再是使用“[]”了。 

下来我们进行讲解vector的几个重要的接口。 

头插/头删及其衍生:

 在vector中,也存在头插和头删的接口

在这里我们顺利的完成了头插和头删。

如果这个地方要删除的不是第一个值而是第三个值的话,可以在begin()的后面加上想要删除数据的位置,一样可以吧这个地方的数据进行删除

但是有些数组中数的数量多,可能有几百甚至上千个,我们也许不知道我们想要删除的那个数据在哪里,这个时候就需要去“找”那个数据了。 

这里查找数据和删除数据和string如出一辙我们就不多讲解了。 

还有另外一种数组,数组中我们要删除的数据可能是多个的,也就是说一个数组里面有多个3,这个时候要想将所有的3都删除要做些什么? 

这里就要对我们的原代码进行修改。

进行修改最原始和传统的方法就是——将if语句换成while循环语句,然后再将find接口的代码cv一下,这样就可以完成我们的要求

但是这种方法的效率却是不高,因为每一次都要重头开始找。 

这里有人可能就会问了,在while循环中再次查找find的时候,不能从pos+1的位置开始查找吗,这样就不用每次都回到原点再重新走一遍。 

这种方法理论来说是可以的,但是现实中这个地方会涉及到迭代器失效的问题,这里在后面会学到,我们这块就不对其进行讲解了。

当然了,我们的vector也有扩容接口,它的书写形式和string差不多。 

结尾: 

刚回学校不久,作者本人的状态还在暑假中,调整可能还需要一点时间。因此最近的博客每一篇也写得比较少,到后面调整回来后,博客的质量会有提升。最后希望这篇博客能给各位带来一些什么。

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

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

相关文章

当promise遇上generator该如何应对?记一次工作中遇到的问题

问题背景 我们项目中有个保存功能,但是这个保存是一个异步函数,内部很多逻辑,比如说校验表单数据,获取子组件数据,数据处理,数据提交给后端获取中间值,最后保存。说明一下,我们的项…

项目经理摆脱「计划无用」的秘诀!

项目经理面临的最大挑战是项目计划执行不到位,导致项目进度严重滞后。这种情况下,尽管他们手中握有项目计划,但实际上却形同虚设,几乎无法发挥应有的作用。 许多项目经理喜欢陈述一些既定的事实,强调一些难以克服的困…

虚幻动画系统概述

本文主要整理一下高层次的概述,方便后续查阅 1.动画流程 DCC产出动画文件 -> UE动画导入 -> 动画蓝图驱动(类似unity的动画状态机) ->动画后处理蓝图驱动(例如修型骨,骨骼矫正等后期处理) 2.动…

淘宝直通车质量分怎么提高?

1、直通车关键词新质量分是什么 (1)创意质量:就是获取流量的能力,和关键词在店铺中基本数据的展现 (2)买家体验:最终的成交能力,在有相关性的前提下,可以提升创意分和体…

【C++】C++多线程库的使用

C线程库的使用 一、线程库(thread)1、线程的id类2、线程对象的构造3、thread提供的其他成员函数4、this_thread命名空间5、线程函数的参数问题 二、互斥量库(mutex)1、mutex的种类2、lock_guard和unique_locklock_guardunique_loc…

marisa-trie——一个基于高效Trie树实现的快速高效字符串压缩存储、查询匹配工具实践

在前文中,讲到了因为实际项目的需要,调研了一下当前比较好用字符串查询匹配算法,感兴趣的话可以直接看下: 《pyahocorasick——基于AC自动机的python高效字符串匹配实践》 本文的主要目的同前文相同,这里主要是介绍一…

Linux 6.6 中的 SELinux 删除了 NSA 的引用

导读Security Enhanced Linux (SELinux) 二十年来一直是主线内核的一部分,它提供了一个实现访问控制安全策略的模块,现在广泛用于增强生产 Linux 服务器和其他系统的安全性。长期接触 Linux 的人可能不知道 SELinux 源自美国国家安全局 (NSA)。但是现在 …

centos 下 Makefile 独立模块编译ko

1、安装编译内核环境包 编译需要用到kernel 源码,centos 下需先安装 kernel-devel 包,要下与自己kernel 对应版本 yum install kernel-devel 2、首先从内核或自己写的模块,发到编译环境中 注:就像我自己拷贝一个 bcache 驱动的目…

pinduoduo(商品优惠券)API接口

为了进行电商平台 的API开发,首先我们需要做下面几件事情。 1)开发者注册一个账号 2)然后为每个pinduoduo应用注册一个应用程序键(App Key) 。 3)下载pinduoduo API的SDK并掌握基本的API基础知识和调用 4&#xff…

在Ubuntu系统中安装Docker

👨 作者简介:大家好,我是Taro,前端领域创作者 ✒️ 个人主页:唐璜Taro 🚀 支持我:点赞👍📝 评论 ⭐️收藏 文章目录 前言一、Ubuntu是什么?二、安装Docker1.…

2023-简单点-开启防火墙后,ping显示请求超时;windows共享盘挂在不上

情景描述 树莓派 挂载 windows共享盘 之前一直可以,突然有一天不行了 ping xxxx不通了 一查,或许是服务器被同事开了防火墙,默认关闭了ping的回显 操作: 开启ping回显cmd ping通了,但是挂载还是不行, 显示 dmesg命…

Mac电脑其他文件太占内存?如何进行删除

Mac老用户都知道在我们查看Mac内存时都会发现有一条“其他文件”占比非常高,它是Mac储存空间中的“其他”数据包含不可移除的移动资源,如,Siri 语音、字体、词典、钥匙串和 CloudKit 数据库、系统无法删除缓存的文件等。这些“其他文件”无用…

故障治理:如何进行故障复盘

故障复盘的重要性无需多说,每一次故障都是宝贵的学习机会,本人接手故障复盘工作已经半年有余,从一开始的手足无措,慢慢变得游刃有余。以下内容为本人从网上查阅学习多个专家经验,并结合工作经历总结而来,仅…

敏捷开发的几个要点

敏捷开发是一种以人为核心,迭代、增量式的软件开发方法。它强调团队成员的自我管理、面对变化时的快速适应能力,以及持续的沟通和协作。 以下是敏捷开发的几个要点: 敏捷宣言:敏捷开发遵循敏捷宣言,其中包括四个价值…

冠达管理:普通股是什么?

普通股是最常见的股票类型,由一家公司发行。买家以此实际上成为该公司的部分所有者,能够享有公司的股息和收益,一起还承当出资的危险。本文将从多个角度剖析普通股,其间包含普通股的定义、普通股的权益、普通股的优缺点、普通股的…

Python是否被高估了?

作为一门简洁易用、生态蓬勃且具有高泛用性的编程语言,Python一直以来都被不少人称作“编程语言中的瑞士军刀”。 尤其随着近来AI热潮席卷全球,Python在编程语言圈中的地位也随之水涨船高,甚至一度被视作AI专用语言或大数据专用语言。 然而…

华为交换机:MSTP的基础配置

现状分析 某公司的总部包含4个部门,为了增加网络的可靠性,需要所在的交换机上配置MSTP,确保网络不会出现环路问题,同时实现负载均衡。 网络设计 搭建网络拓扑,配置VLAN,Trunk,链路聚合。在4台…

腾讯云centos7.6安装部署备忘

1.Mysql 1.1 安装mysql wget http://dev.mysql.com/get/mysql-community-release-el7-5.noarch.rpm rpm -ivh mysql-community-release-el7-5.noarch.rpm yum install mysql-community-server 1.1.1 安装后重启 service mysqld restart 1.1.2 初次安装mysql,root账…

谁懂啊!自制的科普安全手册居然火了

自制的科普安全手册居然火了 谁懂啊! 嗨嗨嗨!小仙女们,有没有见过这样的可以翻页的电子安全手册呢?自己随手就能轻松制作手册,结果一晚浏览量这么多!这可真是让人又惊又喜啊!快来分享一下我的喜…

vscode 左侧文件夹不见了

1.选择view 2.选择open view 3.找到folder 4.左侧出现folder