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…...
基于大模型的 UI 自动化系统
基于大模型的 UI 自动化系统 下面是一个完整的 Python 系统,利用大模型实现智能 UI 自动化,结合计算机视觉和自然语言处理技术,实现"看屏操作"的能力。 系统架构设计 #mermaid-svg-2gn2GRvh5WCP2ktF {font-family:"trebuchet ms",verdana,arial,sans-…...
微信小程序之bind和catch
这两个呢,都是绑定事件用的,具体使用有些小区别。 官方文档: 事件冒泡处理不同 bind:绑定的事件会向上冒泡,即触发当前组件的事件后,还会继续触发父组件的相同事件。例如,有一个子视图绑定了b…...
MVC 数据库
MVC 数据库 引言 在软件开发领域,Model-View-Controller(MVC)是一种流行的软件架构模式,它将应用程序分为三个核心组件:模型(Model)、视图(View)和控制器(Controller)。这种模式有助于提高代码的可维护性和可扩展性。本文将深入探讨MVC架构与数据库之间的关系,以…...
生成 Git SSH 证书
🔑 1. 生成 SSH 密钥对 在终端(Windows 使用 Git Bash,Mac/Linux 使用 Terminal)执行命令: ssh-keygen -t rsa -b 4096 -C "your_emailexample.com" 参数说明: -t rsa&#x…...
自然语言处理——循环神经网络
自然语言处理——循环神经网络 循环神经网络应用到基于机器学习的自然语言处理任务序列到类别同步的序列到序列模式异步的序列到序列模式 参数学习和长程依赖问题基于门控的循环神经网络门控循环单元(GRU)长短期记忆神经网络(LSTM)…...
docker 部署发现spring.profiles.active 问题
报错: org.springframework.boot.context.config.InvalidConfigDataPropertyException: Property spring.profiles.active imported from location class path resource [application-test.yml] is invalid in a profile specific resource [origin: class path re…...
LINUX 69 FTP 客服管理系统 man 5 /etc/vsftpd/vsftpd.conf
FTP 客服管理系统 实现kefu123登录,不允许匿名访问,kefu只能访问/data/kefu目录,不能查看其他目录 创建账号密码 useradd kefu echo 123|passwd -stdin kefu [rootcode caozx26420]# echo 123|passwd --stdin kefu 更改用户 kefu 的密码…...
Web中间件--tomcat学习
Web中间件–tomcat Java虚拟机详解 什么是JAVA虚拟机 Java虚拟机是一个抽象的计算机,它可以执行Java字节码。Java虚拟机是Java平台的一部分,Java平台由Java语言、Java API和Java虚拟机组成。Java虚拟机的主要作用是将Java字节码转换为机器代码&#x…...
水泥厂自动化升级利器:Devicenet转Modbus rtu协议转换网关
在水泥厂的生产流程中,工业自动化网关起着至关重要的作用,尤其是JH-DVN-RTU疆鸿智能Devicenet转Modbus rtu协议转换网关,为水泥厂实现高效生产与精准控制提供了有力支持。 水泥厂设备众多,其中不少设备采用Devicenet协议。Devicen…...
Linux 下 DMA 内存映射浅析
序 系统 I/O 设备驱动程序通常调用其特定子系统的接口为 DMA 分配内存,但最终会调到 DMA 子系统的dma_alloc_coherent()/dma_alloc_attrs() 等接口。 关于 dma_alloc_coherent 接口详细的代码讲解、调用流程,可以参考这篇文章,我觉得写的非常…...
