Learining C++ No.12【vector】
引言:
北京时间: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类模板的数据类型改变了而已;如下图:

总而言之就是模板的数据类型不同而已

总结:考试中,没什么状态写,让我摆烂一个一个星期吧!
相关文章:
Learining C++ No.12【vector】
引言: 北京时间:2023/2/27/11:42,高数考试还在进行中,我充分意识到了学校的不高级,因为题目真的没什么意思,虽然挺平易近人,但是……,考试期间时间比较放松,所以不能耽误…...
【数电基础】——逻辑代数运算
目录 1.概念 1.基本逻辑概念 2.基本逻辑电路(与或非) 逻辑与运算 与门电路: 逻辑或运算 或门电路: 逻辑非运算(逻辑反) 非门电路编辑 3.复合逻辑电路(运算) 与非逻辑…...
【Redis】什么是缓存与数据库双写不一致?怎么解决?
1. 热点缓存重建 我们以热点缓存 key 重建来一步步引出什么是缓存与数据库双写不一致,及其解决办法。 1.1 什么是热点缓存重建 在实际开发中,开发人员使用 “缓存 过期时间” 的策略来实现加速数据读写和内存使用率,这种策略能满足大多数…...
互联网衰退期,测试工程师35岁之路怎么走...
国内的互联网行业发展较快,所以造成了技术研发类员工工作强度比较大,同时技术的快速更新又需要员工不断的学习新的技术。因此淘汰率也比较高,超过35岁的基层研发类员工,往往因为家庭原因、身体原因,比较难以跟得上工作…...
动态规划(以背包问题为例)
1) 要求达到的目标为装入的背包的总价值最大,并且重量不超出2) 要求装入的物品不能重复动态规划(Dynamic Programming)算法的核心思想是:将大问题划分为小问题进行解决,从而一步步获取最优解的处理算法。动态规划算法与分治算法类似ÿ…...
Java异常
异常的体系结构 在java的Throwable下有Error和Exception两个子类 Error(错误):程序运行中出现了严重的问题,非代码性错误,无法处理,常见的有虚拟机运行错误和内存溢出等Exception(异常):是由于代码本身造成的问题,可以进行处理,异常一个可以分为运行时异常和编译时异常 运行…...
别克GL8改装完工,一起来看看效果
①豪华商务头等舱 别克GL8作为商务车,不管是家用还是商务接待,原车内饰都太掉档次了,所以车主要求全部换掉。>>织布座椅换成航空座椅 主副驾:改装纳帕皮 中排:改装水晶宝座豪华版航空座椅,带通风、加…...
mac 中 shell 一些知识
mac 设置环境变量首先得看你所使用的 shell shell 是一个命令行解释器,顾名思义就是机器外面的一层壳,用于人机交互,只要是人与电脑之间交互的接口,就可以称为 shell。表现为其作用是用户输入一条命令,shell 就立即解…...
CentOS 配置FTP(开启VSFTPD服务)
网上已经有很多关于VSFTPD的配置,但有两个通病,要么就是原理介绍太多,要么就是不完整,操作下来又要查询多篇文章才能用。 我这里不讲原理,只记录操作,尽可能通过复制下面的操作可以实现FTP读写功能。方便自…...
Http的请求方法
Http的请求方法对应的数据传输能力把Http请求分为Url类请求和Body类请求 1.Url类请求包括但不限于GET、HEAD、OPTIONS、TRACE 等请求方法 2.Body类请求包括但不限于POST、PUSH、PATCH、DELETE 等请求方法。 3.原因:get请求没有请求体(好像也可以…...
Python字典-- 内附蓝桥题:统计数字
字典 ~~不定时更新🎃,上次更新:2023/02/28 🗡常用函数(方法) 1. dic.get(key) --> 判断字典 dic 是否有 key,有返回其对应的值,没有返回 None 举个栗子🌰 dic …...
文本处理工具
Grep工具的基本使用grep作用:grep是行过滤工具;用于根据关键字进行行过滤提示:通过alias命令设置grep别名,搜索参数时带颜色显示alias grepgrep colorauto 命令语法格式:grep [选项] 参数 文件名grep命令选项ÿ…...
C++STL详解(三)——vector的介绍和使用
文章目录vector的介绍vector的使用vector的定义方式vector的空间增长问题reserve和resizevector的迭代器使用begin 和endrbegin和rendinsert 和erasefind函数元素访问vector迭代器失效问题1:inserse插入扩容时空间销毁造成野指针问题2:erase删除或者inse…...
GEBCO海洋数据下载
一、数据集简介 GEBCO(General Bathymetric chart of the Oceans)旨在为世界海洋提供最权威的、可公开获取的测深数据集。 目前的网格化测深数据集,即GEBCO_2022网格,是一个全球海洋和陆地的地形模型,在15角秒间隔的…...
【C++容器】vector、map、hash_map、unordered_map四大容器的性能分析【2023.02.28】
摘要 vector是标准容器对数组的封装,是一段连续的线性的内存。map底层是二叉排序树。hash_map是C11之前的无序map,unordered_map底层是hash表,涉及桶算法。现对各个容器的查询与”插入“性能做对比分析,方便后期选择。 测试方案…...
ACM-蓝桥杯训练第一周
🚀write in front🚀 📝个人主页:认真写博客的夏目浅石.CSDN 🎁欢迎各位→点赞👍 收藏⭐️ 留言📝 📣系列专栏:ACM周训练题目合集.CSDN 💬总结:…...
python基础—字符串操作
(1)字符串: Python内置了一系列的数据类型,其中最主要的内置类型是数值类型、文本序列(字符串)类型、序列(列表、元组和range)类型、集合类型、映射(字典)类型…...
【Spring】通过JdbcTemplate实现CRUD操作
个人简介:Java领域新星创作者;阿里云技术博主、星级博主、专家博主;正在Java学习的路上摸爬滚打,记录学习的过程~ 个人主页:.29.的博客 学习社区:进去逛一逛~ 通过JdbcTemplate实现 增删查改一、添加相关依…...
实战|掌握Linux内存监视:free命令详解与使用技巧
文章目录前言一. free命令介绍二. 语法格式及常用选项三. 参考案例3.1 查看free相关的信息3.2 以MB的形式显示内存的使用情况3.3 以总和的形式显示内存的使用情况3.4 周期性的查询内存的使用情况3.5 以更人性化的形式来查看内存的结果输出四. free在脚本中的应用总结前言 大家…...
嵌入式入门必看!调试工具安装——基于 AM64x核心板
本章节内容是为评估板串口安装USB转串口驱动程序。驱动适用于CH340、CH341等USB转串口芯片。 USB转串口驱动安装 适用安装环境:Windows 7 64bit、Windows 10 64bit。 本文测试板卡为创龙科技SOM-TL64x核心板,它是一款基于TI Sitara系列AM64x双核ARM Cortex-A53 + 单/四核Cort…...
龙虎榜——20250610
上证指数放量收阴线,个股多数下跌,盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型,指数短线有调整的需求,大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的:御银股份、雄帝科技 驱动…...
树莓派超全系列教程文档--(61)树莓派摄像头高级使用方法
树莓派摄像头高级使用方法 配置通过调谐文件来调整相机行为 使用多个摄像头安装 libcam 和 rpicam-apps依赖关系开发包 文章来源: http://raspberry.dns8844.cn/documentation 原文网址 配置 大多数用例自动工作,无需更改相机配置。但是,一…...
LLM基础1_语言模型如何处理文本
基于GitHub项目:https://github.com/datawhalechina/llms-from-scratch-cn 工具介绍 tiktoken:OpenAI开发的专业"分词器" torch:Facebook开发的强力计算引擎,相当于超级计算器 理解词嵌入:给词语画"…...
【学习笔记】深入理解Java虚拟机学习笔记——第4章 虚拟机性能监控,故障处理工具
第2章 虚拟机性能监控,故障处理工具 4.1 概述 略 4.2 基础故障处理工具 4.2.1 jps:虚拟机进程状况工具 命令:jps [options] [hostid] 功能:本地虚拟机进程显示进程ID(与ps相同),可同时显示主类&#x…...
html-<abbr> 缩写或首字母缩略词
定义与作用 <abbr> 标签用于表示缩写或首字母缩略词,它可以帮助用户更好地理解缩写的含义,尤其是对于那些不熟悉该缩写的用户。 title 属性的内容提供了缩写的详细说明。当用户将鼠标悬停在缩写上时,会显示一个提示框。 示例&#x…...
2023赣州旅游投资集团
单选题 1.“不登高山,不知天之高也;不临深溪,不知地之厚也。”这句话说明_____。 A、人的意识具有创造性 B、人的认识是独立于实践之外的 C、实践在认识过程中具有决定作用 D、人的一切知识都是从直接经验中获得的 参考答案: C 本题解…...
Aspose.PDF 限制绕过方案:Java 字节码技术实战分享(仅供学习)
Aspose.PDF 限制绕过方案:Java 字节码技术实战分享(仅供学习) 一、Aspose.PDF 简介二、说明(⚠️仅供学习与研究使用)三、技术流程总览四、准备工作1. 下载 Jar 包2. Maven 项目依赖配置 五、字节码修改实现代码&#…...
R语言速释制剂QBD解决方案之三
本文是《Quality by Design for ANDAs: An Example for Immediate-Release Dosage Forms》第一个处方的R语言解决方案。 第一个处方研究评估原料药粒径分布、MCC/Lactose比例、崩解剂用量对制剂CQAs的影响。 第二处方研究用于理解颗粒外加硬脂酸镁和滑石粉对片剂质量和可生产…...
vulnyx Blogger writeup
信息收集 arp-scan nmap 获取userFlag 上web看看 一个默认的页面,gobuster扫一下目录 可以看到扫出的目录中得到了一个有价值的目录/wordpress,说明目标所使用的cms是wordpress,访问http://192.168.43.213/wordpress/然后查看源码能看到 这…...
比较数据迁移后MySQL数据库和OceanBase数据仓库中的表
设计一个MySQL数据库和OceanBase数据仓库的表数据比较的详细程序流程,两张表是相同的结构,都有整型主键id字段,需要每次从数据库分批取得2000条数据,用于比较,比较操作的同时可以再取2000条数据,等上一次比较完成之后,开始比较,直到比较完所有的数据。比较操作需要比较…...
