当前位置: 首页 > news >正文

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】

引言&#xff1a; 北京时间&#xff1a;2023/2/27/11:42&#xff0c;高数考试还在进行中&#xff0c;我充分意识到了学校的不高级&#xff0c;因为题目真的没什么意思&#xff0c;虽然挺平易近人&#xff0c;但是……&#xff0c;考试期间时间比较放松&#xff0c;所以不能耽误…...

【数电基础】——逻辑代数运算

目录 1.概念 1.基本逻辑概念 2.基本逻辑电路&#xff08;与或非&#xff09; 逻辑与运算 与门电路&#xff1a; 逻辑或运算 或门电路&#xff1a; ​逻辑非运算&#xff08;逻辑反&#xff09; 非门电路​编辑 3.复合逻辑电路&#xff08;运算&#xff09; 与非逻辑…...

【Redis】什么是缓存与数据库双写不一致?怎么解决?

1. 热点缓存重建 我们以热点缓存 key 重建来一步步引出什么是缓存与数据库双写不一致&#xff0c;及其解决办法。 1.1 什么是热点缓存重建 在实际开发中&#xff0c;开发人员使用 “缓存 过期时间” 的策略来实现加速数据读写和内存使用率&#xff0c;这种策略能满足大多数…...

互联网衰退期,测试工程师35岁之路怎么走...

国内的互联网行业发展较快&#xff0c;所以造成了技术研发类员工工作强度比较大&#xff0c;同时技术的快速更新又需要员工不断的学习新的技术。因此淘汰率也比较高&#xff0c;超过35岁的基层研发类员工&#xff0c;往往因为家庭原因、身体原因&#xff0c;比较难以跟得上工作…...

动态规划(以背包问题为例)

1) 要求达到的目标为装入的背包的总价值最大&#xff0c;并且重量不超出2) 要求装入的物品不能重复动态规划(Dynamic Programming)算法的核心思想是&#xff1a;将大问题划分为小问题进行解决&#xff0c;从而一步步获取最优解的处理算法。动态规划算法与分治算法类似&#xff…...

Java异常

异常的体系结构 在java的Throwable下有Error和Exception两个子类 Error(错误):程序运行中出现了严重的问题,非代码性错误,无法处理,常见的有虚拟机运行错误和内存溢出等Exception(异常):是由于代码本身造成的问题,可以进行处理,异常一个可以分为运行时异常和编译时异常 运行…...

别克GL8改装完工,一起来看看效果

①豪华商务头等舱 别克GL8作为商务车&#xff0c;不管是家用还是商务接待&#xff0c;原车内饰都太掉档次了&#xff0c;所以车主要求全部换掉。>>织布座椅换成航空座椅 主副驾&#xff1a;改装纳帕皮 中排&#xff1a;改装水晶宝座豪华版航空座椅&#xff0c;带通风、加…...

mac 中 shell 一些知识

mac 设置环境变量首先得看你所使用的 shell shell 是一个命令行解释器&#xff0c;顾名思义就是机器外面的一层壳&#xff0c;用于人机交互&#xff0c;只要是人与电脑之间交互的接口&#xff0c;就可以称为 shell。表现为其作用是用户输入一条命令&#xff0c;shell 就立即解…...

CentOS 配置FTP(开启VSFTPD服务)

网上已经有很多关于VSFTPD的配置&#xff0c;但有两个通病&#xff0c;要么就是原理介绍太多&#xff0c;要么就是不完整&#xff0c;操作下来又要查询多篇文章才能用。 我这里不讲原理&#xff0c;只记录操作&#xff0c;尽可能通过复制下面的操作可以实现FTP读写功能。方便自…...

Http的请求方法

Http的请求方法对应的数据传输能力把Http请求分为Url类请求和Body类请求 1.Url类请求包括但不限于GET、HEAD、OPTIONS、TRACE 等请求方法 2.Body类请求包括但不限于POST、PUSH、PATCH、DELETE 等请求方法。 3.原因&#xff1a;get请求没有请求体&#xff08;好像也可以…...

Python字典-- 内附蓝桥题:统计数字

字典 ~~不定时更新&#x1f383;&#xff0c;上次更新&#xff1a;2023/02/28 &#x1f5e1;常用函数&#xff08;方法&#xff09; 1. dic.get(key) --> 判断字典 dic 是否有 key&#xff0c;有返回其对应的值&#xff0c;没有返回 None 举个栗子&#x1f330; dic …...

文本处理工具

Grep工具的基本使用grep作用&#xff1a;grep是行过滤工具&#xff1b;用于根据关键字进行行过滤提示&#xff1a;通过alias命令设置grep别名&#xff0c;搜索参数时带颜色显示alias grepgrep colorauto 命令语法格式&#xff1a;grep [选项] 参数 文件名grep命令选项&#xff…...

C++STL详解(三)——vector的介绍和使用

文章目录vector的介绍vector的使用vector的定义方式vector的空间增长问题reserve和resizevector的迭代器使用begin 和endrbegin和rendinsert 和erasefind函数元素访问vector迭代器失效问题1&#xff1a;inserse插入扩容时空间销毁造成野指针问题2&#xff1a;erase删除或者inse…...

GEBCO海洋数据下载

一、数据集简介 GEBCO&#xff08;General Bathymetric chart of the Oceans&#xff09;旨在为世界海洋提供最权威的、可公开获取的测深数据集。 目前的网格化测深数据集&#xff0c;即GEBCO_2022网格&#xff0c;是一个全球海洋和陆地的地形模型&#xff0c;在15角秒间隔的…...

【C++容器】vector、map、hash_map、unordered_map四大容器的性能分析【2023.02.28】

摘要 vector是标准容器对数组的封装&#xff0c;是一段连续的线性的内存。map底层是二叉排序树。hash_map是C11之前的无序map&#xff0c;unordered_map底层是hash表&#xff0c;涉及桶算法。现对各个容器的查询与”插入“性能做对比分析&#xff0c;方便后期选择。 测试方案…...

ACM-蓝桥杯训练第一周

&#x1f680;write in front&#x1f680; &#x1f4dd;个人主页&#xff1a;认真写博客的夏目浅石.CSDN &#x1f381;欢迎各位→点赞&#x1f44d; 收藏⭐️ 留言&#x1f4dd;​ &#x1f4e3;系列专栏&#xff1a;ACM周训练题目合集.CSDN &#x1f4ac;总结&#xff1a…...

python基础—字符串操作

&#xff08;1&#xff09;字符串&#xff1a; Python内置了一系列的数据类型&#xff0c;其中最主要的内置类型是数值类型、文本序列&#xff08;字符串&#xff09;类型、序列&#xff08;列表、元组和range&#xff09;类型、集合类型、映射&#xff08;字典&#xff09;类型…...

【Spring】通过JdbcTemplate实现CRUD操作

个人简介&#xff1a;Java领域新星创作者&#xff1b;阿里云技术博主、星级博主、专家博主&#xff1b;正在Java学习的路上摸爬滚打&#xff0c;记录学习的过程~ 个人主页&#xff1a;.29.的博客 学习社区&#xff1a;进去逛一逛~ 通过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…...

【SpringBoot】100、SpringBoot中使用自定义注解+AOP实现参数自动解密

在实际项目中,用户注册、登录、修改密码等操作,都涉及到参数传输安全问题。所以我们需要在前端对账户、密码等敏感信息加密传输,在后端接收到数据后能自动解密。 1、引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId...

第一篇:Agent2Agent (A2A) 协议——协作式人工智能的黎明

AI 领域的快速发展正在催生一个新时代&#xff0c;智能代理&#xff08;agents&#xff09;不再是孤立的个体&#xff0c;而是能够像一个数字团队一样协作。然而&#xff0c;当前 AI 生态系统的碎片化阻碍了这一愿景的实现&#xff0c;导致了“AI 巴别塔问题”——不同代理之间…...

Swagger和OpenApi的前世今生

Swagger与OpenAPI的关系演进是API标准化进程中的重要篇章&#xff0c;二者共同塑造了现代RESTful API的开发范式。 本期就扒一扒其技术演进的关键节点与核心逻辑&#xff1a; &#x1f504; 一、起源与初创期&#xff1a;Swagger的诞生&#xff08;2010-2014&#xff09; 核心…...

学校时钟系统,标准考场时钟系统,AI亮相2025高考,赛思时钟系统为教育公平筑起“精准防线”

2025年#高考 将在近日拉开帷幕&#xff0c;#AI 监考一度冲上热搜。当AI深度融入高考&#xff0c;#时间同步 不再是辅助功能&#xff0c;而是决定AI监考系统成败的“生命线”。 AI亮相2025高考&#xff0c;40种异常行为0.5秒精准识别 2025年高考即将拉开帷幕&#xff0c;江西、…...

Angular微前端架构:Module Federation + ngx-build-plus (Webpack)

以下是一个完整的 Angular 微前端示例&#xff0c;其中使用的是 Module Federation 和 npx-build-plus 实现了主应用&#xff08;Shell&#xff09;与子应用&#xff08;Remote&#xff09;的集成。 &#x1f6e0;️ 项目结构 angular-mf/ ├── shell-app/ # 主应用&…...

论文笔记——相干体技术在裂缝预测中的应用研究

目录 相关地震知识补充地震数据的认识地震几何属性 相干体算法定义基本原理第一代相干体技术&#xff1a;基于互相关的相干体技术&#xff08;Correlation&#xff09;第二代相干体技术&#xff1a;基于相似的相干体技术&#xff08;Semblance&#xff09;基于多道相似的相干体…...

【JavaSE】多线程基础学习笔记

多线程基础 -线程相关概念 程序&#xff08;Program&#xff09; 是为完成特定任务、用某种语言编写的一组指令的集合简单的说:就是我们写的代码 进程 进程是指运行中的程序&#xff0c;比如我们使用QQ&#xff0c;就启动了一个进程&#xff0c;操作系统就会为该进程分配内存…...

Python 实现 Web 静态服务器(HTTP 协议)

目录 一、在本地启动 HTTP 服务器1. Windows 下安装 node.js1&#xff09;下载安装包2&#xff09;配置环境变量3&#xff09;安装镜像4&#xff09;node.js 的常用命令 2. 安装 http-server 服务3. 使用 http-server 开启服务1&#xff09;使用 http-server2&#xff09;详解 …...

WPF八大法则:告别模态窗口卡顿

⚙️ 核心问题&#xff1a;阻塞式模态窗口的缺陷 原始代码中ShowDialog()会阻塞UI线程&#xff0c;导致后续逻辑无法执行&#xff1a; var result modalWindow.ShowDialog(); // 线程阻塞 ProcessResult(result); // 必须等待窗口关闭根本问题&#xff1a…...

【LeetCode】算法详解#6 ---除自身以外数组的乘积

1.题目介绍 给定一个整数数组 nums&#xff0c;返回 数组 answer &#xff0c;其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法&#xff0c;且在 O…...