Learining C++ No.12【vector】

news2024/9/22 1:32:20

引言:

北京时间:2023/2/27/11:42,高数考试还在进行中,我充分意识到了学校的不高级,因为题目真的没什么意思,虽然挺平易近人,但是……,考试期间时间比较放松,所以不能耽误我更新博客,自从上篇博客,我们把string类的基本知识学习完之后,今天我们的主要目标就是学习一下什么是vector

在这里插入图片描述

复习模板(从模板开始学习vector)

首先vector是什么:
在C++中vector是一个类,是一个类似于string类的类,并且它们都是一个模板类,区别于string类,vector是一个可以管理任意数组的数组(只要数据类型合适),但string类是一个只针对于字符串数组的字符串类,所以本质上vector就是用一个动态增长的数组实现的模板类。

认识了vector是什么,现在我们可以知道,它就是一个动态数组,并且它可以通过类模板的形式,来管理不同的数据类型,所以我们意识到,类模板和vector是有一定的联系的,此时我们就需要类从模板的知识入手,以浅入深学习STL中的vector容器

类模板:

定义模板形式:

template<class T>

这个代码就可以实现,函数模板和类模板定义,此时无论是函数中,还是类中,都可以通过替换 <>尖括号中的类型来替换整个函数或者整个类中的数据类型,以方便于给所有的类型的数据使用,如下图:
在这里插入图片描述
此时就可以如上图main函数中,通过在尖括号<> 中使用不同的数据类型实现对Stack整个类使用不同的数据类型,进而实现泛型编程,充分使用类模板。

所以可以看出我们的STL中的vector类就是通过类模板的形式,实现的一个可以针对所有数据类型的动态数组。

总:vector类区别于string类的本质原因就是vector类通过类模板的形式实现可以针对所有数据类型的动态数组

vector的学习

了解了什么是类模板,什么是vector的本质,此时正式开始学习vector,首先还是那句话,vector类和string类本质上是没有什么区别的,最大的区别就是数据类型的不同,所以此时我们学习vector类的过程中本质上还是在学习string类,又因为我们上篇博客已经学习了什么是string类,此时学习vector类时,我们就会变得更加的轻松,并且,使用vector类会变得更加的方便。
在这里插入图片描述
懂的上述,我们知道学习vector还是在吃旧饭,所以我们按照以前的方式来进行学习就行了,首先第一步打开C++官网,寻找vector的具体说明和各种成员函数,在vector的首页,我们就可以看到上图的内容,vector和我们所说的一样,是一个类模板,并且此时还使用了一个新的概念:空间配置器(内存池)的概念,目的就是为了可以提高数组申请空间方面的效率

注:空间配置器是 STL 源码中实现的一个小灶,用来应对 STL 容器频繁申请小块内存空间的问题。 他算是一个小型的内存池 ,以提升STL 容器在空间申请方面的效率

下面,我们就围绕着vector类的一些常用的接口,来深入了解一下vector的具体实现

首先是vector类中的构造函数:
在这里插入图片描述
如下图:就是一个简单的vector类的使用:

其中使用了vector类中的,尾插(push_back)、迭代器(iterator)、方括号加下标([])和拷贝构造函数(copy

:头文件 #include<vector>

了解了vector类的基本使用,此时我们就来看一看它构造函数中的 fill 的使用,初始化对象(往数组中填充数据)和迭代器区间(range)的使用:
在这里插入图片描述
在这里插入图片描述

迭代器区间

并且此时我们发现,该迭代器的类型不是以前我们所见的 iterator 而是 inputiterator,此时 inputiterator 代表的就是一个可以接收任意容器的迭代器区间,不单单只是vector容器,也可以是别的容器,例:string类(前提是数据类型可以匹配上),并且此时我们了解到迭代器是有非常多的种类的,具体可以参考该链接:迭代器种类和使用

如下图:证明我们的vector迭代器是可以接收任意容器的迭代器区间的(因为vector类中的迭代器是使用 inputiterator 类型的迭代器)
在这里插入图片描述

并且因为此时我们使用的是一个迭代器区间,所以我们可以规定,迭代器的开始位置和结束位置,通过begin()end()来控制,:此时char类型转化为int类型,本质上是类型转换,然后通过ASCII码值来进行打印,如下图:
在这里插入图片描述

逆向迭代器

搞定了上述迭代器区间的使用,此时我们来看一看以前了解过的逆向迭代器的使用,如下图:
在这里插入图片描述
所以我们可以发现,虽然范围for用起来非常的方便,但是并不可以支持逆向遍历,并且本质上范围for使用的是迭代器,所以本质上迭代器才是王者,并且以后我们遇到别的数据类型,例如:树状结构或者链表,这些遍历都是使用迭代器进行的。

开空间函数(reserve和resize)

reserve:
搞定了vector类中的构造函数,此时我们看一看,vector中别的函数,如:reserve函数(提前开空间函数),如下图:
在这里插入图片描述
该图,充分展示了开空间函数(reserve)的使用。

resize:
了解vector类中的resize函数,我们通过一个题目来搞定它:

题目:给定一个非负整数,生成杨辉三角的前numRows行,在杨辉三角中,每个数是它左上方的数的和

class Solution1
{
public:
	vector<vector<int>> generate(int numRows)//此时就是一个类中类的使用,例:vector<int>中代表的是该vector中的每个 数据是int,而vector<vector<int>>代表的是,该vector中的数据是vector<int>而已
	{//本质可以理解成一个二维数组:一个vector数组,指向了一个一个的vector的意思
		vector<vector<int>> vv;//此时是可以直接在这里使用类里面的构造函数进行初始化的(但是为了控制类中的数据,我们只能使用resize)
		vv.resize(numRows, vector<int>());//此时这样写的意思就是:开辟numRows行,然后给一个匿名对象(vector<int>)去初始化这些行,当然不使用匿名对象,也可以使用vector<int> v;进行
		for (size_t i = 0; i < vv.size(); ++i)//无论是上面的那个()的意思,还是下面这个()的意思,本质上都是为了取调用函数,获得一个返回值
		{
			vv[i].resize(i + 1, 0);//和上面那句是一样的,开空间,然后用0去初始化(并且此时刚好符合题意:第一行一个数据,第二行两个数据,第三行三个数据,充分体现出for循环的好处)
			vv[i][0] = vv[i][vv[i].size() - 1] = 1;//此时就是根据杨辉三角的特性,把每一行的第一个数据和最后一个数据给成(1)
		}//此时vv[i].size(),其实本质上还是vector<int>类,不是int类,所以此时表示的是第几个vector<int>,然后把该类的大小减1给给它

		for (size_t i = 0; i < vv.size(); ++i)
		{
			for (size_t j = 0; j < vv[i].size(); ++i)//vv[i].size()代表的就是vector<int>类中的那个vector数组的大小
			{
				if (vv[i][j] == 0)
				{
					vv[i][j] = vv[i - 1][j] + vv[i - 1][j - 1];//这句代码就是经典的杨辉三角代码(上一行本列的数据+上一行上一列的数据)
				}
			}
		}

		return vv;
	}
};

从上题中,我们可以看出,resize函数在vector中,也具备开空间和初始化的作用,并且从上述代码和注释中,我们可以看出,vector<vector< int >>是可以当作一个指定空间大小的二维数组使用的,只不过此时vector类中不是int,而是一个vector< int >,一个类中类,并且该类内存的类是一个int类型的类。本质上还是模板的作用,只是此时vector类模板的数据类型改变了而已;如下图:
在这里插入图片描述
总而言之就是模板的数据类型不同而已

在这里插入图片描述

总结:考试中,没什么状态写,让我摆烂一个一个星期吧!

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

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

相关文章

通过python技术获取甲流分布数据

近期&#xff0c;多地学校出现因甲流导致的班级停课&#xff0c;儿科甲流患者就诊量呈数倍增长。此轮甲流为何如此严重&#xff1f;感染甲流之后会出现哪些症状&#xff1f; 经过专家的介绍甲流之所以这么严重有这些原因导致的。一、疫情完全放开后很多孩子不戴口罩了&#x…

CData Drivers for Cassandra Crack

CData Drivers for Cassandra Crack Cassandra JDBC驱动程序允许用户连接Cassandra的实时数据。它允许从任何能够支持JDBC连接的应用程序直接连接。它将Java应用程序与实时Cassandra和NoSQL以及云服务和数据库连接起来。用户可以使用ApacheCassandra&#xff0c;因为在本例中&a…

微软新版必应gpt人工智能体验教程

大家好,我是雄雄,欢迎关注微信公众号:** 雄雄的小课堂 ** 现在是:2023年2月28日18:35:02 前言 前几天,发了一篇文章,主要介绍了如何申请新必应的内测名单,其实一共也就那几步,然后等着就行: 文章连接:new bing如何快速申请内测资格,从而体验人工智能? 今天,终于…

电商搜索入门

一、搜索用途通常一个电商平台里面的商品&#xff0c;少则几十万多则上千万甚至上亿的sku&#xff0c;在这么多的商品中&#xff0c;如何让用户可以快速查找到自己想要的商品&#xff0c;那么就需要用到搜索功能来实现。通过分析数据发现&#xff0c;接近40%的点击率是直接通过…

【Redis学习2】Redis常用数据结构与应用场景

Redis常用数据结构与应用场景 redis中存储数据是以key-value键值对的方式去存储的&#xff0c;其中key为string字符类型&#xff0c;value的数据类型可以是string(字符串)、list(列表)、hash(字典)、set(集合) 、 zset(有序集合)。 这5种数据类型在开发中可以应对大部分场景的…

「RISC-V Arch」RISC-V 规范结构

日期&#xff1a;20230228 规范分类 根据 RISC-V 设计哲学&#xff0c;其规范文档也是高度模块化的&#xff1a; ISA 规范&#xff08;2 篇&#xff09; 非特权规范特权规范 非 ISA 规范&#xff08;6篇&#xff09; Trace规范ABI 规范外部调试规范PLIC 规范SBI 规范UEFI 协…

华为OD机试题,用 Java 解【计算网络信号】问题

最近更新的博客 华为OD机试题,用 Java 解【停车场车辆统计】问题华为OD机试题,用 Java 解【字符串变换最小字符串】问题华为OD机试题,用 Java 解【计算最大乘积】问题华为OD机试题,用 Java 解【DNA 序列】问题华为OD机试 - 组成最大数(Java) | 机试题算法思路 【2023】使…

微软徐明强:谈谈ChatGPT及对技术的重新思考

是2023 Microsoft Azure中国区年度技术峰会启幕之际&#xff0c;Azure 云科技推出的专栏。我们邀请了业界富有前瞻视野的技术、业务专家&#xff0c;畅谈行业洞察&#xff0c;共享创新心得。本期专栏文章中&#xff0c;微软全渠道事业部首席技术官徐明强首次在 ChatGPT 爆火后分…

Java知识复习(四)多线程、并发编程

1、进程、线程和程序 进程&#xff1a;进程是程序的一次执行过程&#xff0c;是系统运行程序的基本单位&#xff0c;因此进程是动态的&#xff1b;在 Java 中&#xff0c;当我们启动 main 函数时其实就是启动了一个 JVM 的进程&#xff0c;而 main 函数所在的线程就是这个进程…

JAVA开发(JAVA垃圾回收的几种常见算法)

JAVA GC 是JAVA虚拟机中的一个系统或者说是一个服务&#xff0c;专门是用于内存回收&#xff0c;交还给虚拟机的功能。 JAVA语言相对其他语言除了跨平台性&#xff0c;还有一个最重要的功能是JAVA语言封装了对内存的自动回收。俗称垃圾回收器。所以有时候我们不得不承认&#…

超实用的公众号用户运营方案分享,纯干货

公众运营是以用户为主的&#xff1a; 但是你知道什么是用户运营吗&#xff1f;你的公众号有没有维护好目标用户群体呢&#xff1f;你知道该怎么分析你的公众号用户群体吗&#xff1f;你知道分析完之后具体应该怎么做用户运营吗&#xff1f; 接下来伯乐网络传媒就来给大家分享…

第八届蓝桥杯省赛——7EXCLE地址

题目&#xff1a;Excel单元格的地址表示很有趣&#xff0c;它使用字母来表示列号。比如&#xff0c;A表示第1列&#xff0c;B表示第2列&#xff0c;Z表示第26列&#xff0c;AA表示第27列&#xff0c;AB表示第28列&#xff0c;BA表示第53列&#xff0c;....当然Excel的最大列号是…

【Spring Cloud Alibaba】(五)Dubbo启动报错?一直重连报错?你值得学习的是排查问题的方法

系列目录 【Spring Cloud Alibaba】&#xff08;一&#xff09;微服务介绍 及 Nacos注册中心实战 【Spring Cloud Alibaba】&#xff08;二&#xff09;微服务调用组件Feign原理实战 【Spring Cloud Alibaba】&#xff08;三&#xff09;OpenFeign扩展点实战 源码详解 【Spri…

2.1操作系统-进程管理:进程基本概念、进程与程序、进程与线程、进程的状态、进程三态模型、进程五态模型

2.1操作系统-进程管理&#xff1a;进程基本概念、进程与程序、进程与线程、进程的状态、进程三态模型、进程五态模型进程基本概念进程与程序进程与线程进程的状态进程三态模型进程五态模型进程基本概念 进程是程序在一个数据集合上运行的过程&#xff08;运行的过程&#xff0…

智能驾驶词典 --- 自动驾驶芯片梳理

0 前言 与智能驾驶相关的芯片主要分为自动驾驶芯片&#xff08;边缘端&#xff09;和智能座舱芯片两大类&#xff0c;另外衍生的相关芯片种类还有计算集群芯片&#xff08;云端&#xff09;&#xff0c; 1 自动驾驶芯片梳理 目前业内具有代表性的智驾芯片产品梳理如下。 1…

Studio 3T使用教程,本人详细介绍连接Mongodb过程

1&#xff1a;安装好MongodbWindows下安装 MongoDB_mongodb windows_Dragon-v的博客-CSDN博客2&#xff1a;安装好Studio 3T3&#xff1a;打开 Studio 3T &#xff0c;点击开始创建连接 4&#xff1a;点击 Manually configure my connection settings&#xff0c;然后next5&…

【MySQL之MySQL底层分析篇】系统学习MySQL,从应用SQL语法到底层知识讲解,这将是你见过最完成的知识体系

文章目录MySQL体系结构MySQL存储结构&#xff08;以InnoDB为例&#xff09;MySQL执行流程&#xff08;以InnoDB为例&#xff09;1. 数据写入原理2. 数据查询原理MySQL存储引擎1. 为什么需要不同的存储引擎2. 如何为数据指定不同的存储引擎&#xff0c;数据粒度又是多少3. MySQL…

28岁还是一事无成,现在想学习软件测试还来得及吗?

为什么会学习软件测试&#xff1f; 28岁了&#xff0c;算一下8年了&#xff0c;工作了一年&#xff0c;就没去工作就一-直在家&#xff0c;家里固定每个月给2000,偶尔一个月有四千&#xff0c;但依旧没钱&#xff0c;家里给了一套房子&#xff0c;出门200米就是地铁站&#xff…

【流程控制】JavaScript 全栈体系(五)

JavaScript 基础 第七章 运算符 一、赋值运算符 目标&#xff1a; 能够使用赋值运算符简化代码 赋值运算符&#xff1a;对变量进行赋值的运算符 已经学过的赋值运算符&#xff1a; 将等号右边的值赋予给左边, 要求左边必须是一个容器其他赋值运算符&#xff1a; -*/% 使用…

轻松实现内网穿透:实现远程访问你的私人网络

导语&#xff1a;内网穿透是什么&#xff1f;为什么我们需要它&#xff1f;今天我们将介绍这个令人惊叹的技术&#xff0c;让你实现远程访问你的私人网络。 使用内网穿透&#xff0c;轻松实现外网访问本地部署的网站 第一部分&#xff1a;什么是内网穿透&#xff1f; 通俗解释…