【C++】SLT——Vector详解
本片要分享的是关于STL中Vector的内容,Vector的内容于string非常相似,只要会使用string那么学习Vector时会非常流畅。
目录
1.vector介绍
2.vector的简单实用
2.1.简单的无参构造
编辑2.2.简单带参构造
2.3.迭代器区间初始化
2.4.vector的遍历
2.5.vector插入数据
2.6.扩容机制
不同平台扩容机制
reverse
resize
1.vector介绍

官方的简介是vector是由一个动态增长数组实现的顺序容器,其实再简称一点就是顺序表。
以下是vector的组件
默认成员函数

迭代器

与容量相关的函数
与访问数据相关的函数

与修改容器数据相关的

可以看到上面有我们在string中就接触过的一些函数,比如push_back,下标访问时的operator[],测量长度的size,等等
所以这也是我们学习vector比较容易的原因,同时vector在设计上也基于string有了一些改进,在内部函数的设计方面也更加合理了一些;
2.vector的简单实用
2.1.简单的无参构造
我们上代码来观察,先从最最简单的初始化构造来开始

如上是一个vector的无参构造
首先我们需要包含vector的头文件
其次我们在定义的时候需要将容器实例化, 就是规定我们的数据类型;

2.2.简单带参构造
#include<iostream>
#include<vector>
using namespace std;
void test_vector1()
{vector<int> v1; vector<int> v2(10,0);
}
int main()
{}
观察我们构造的v2,其中有两个参数,那这样的带参构造就是开辟是个空间,并且都初始化为0。
对比C语言我们不仅需要开一个数组,还需要memset,非常的麻烦;
2.3.迭代器区间初始化
#include<iostream>
#include<vector>
using namespace std;
void test_vector1()
{vector<int> v1; vector<int> v2(10,0); vector<int> v3(v2.begin(), v2.end());}
int main()
{test_vector1();return 0;
}
观察v3的初始化方式,我们使用了v2的迭代器的起始位置和末尾的位置
以上是相同容器的迭代器区间的初始化构造,那不同容器之间的初始化构造呢;
#include<iostream>
#include<vector>
using namespace std;
void test_vector1()
{vector<int> v1; vector<int> v2(10,0); vector<int> v3(v2.begin(), v2.end());string s("hello world");vector<int> v4(s.begin(), s.end());}
int main()
{test_vector1();return 0;
}
那当然也是可以的,可以看到我们在初始化v4的时候使用了字符串s的区间,也能完成初始化,但是我们需要注意的是这里的底层涉及到隐式类型转换,所以才能初始化成功。
2.4.vector的遍历
我们在上面的介绍中就可以看到vector读取数据时可以采用[],我们不妨将初始化后的v3进行遍历
void test_vector2()
{vector<int> v2(10, 0);vector<int> v3(v2.begin(), v2.end());for (size_t i = 0; i < v3.size(); i++){cout << v3[i] << ' ';}cout << endl;
}
int main()
{test_vector2();return 0;
}
以下 是输出结果

可以看到我们使用v2迭代器区间初始化的v3输出的结果和我们想要的结果相同。
这里使用了for循环和[ ]对数据进行读取,还可以使用迭代器进行访问。
void test_vector2()
{vector<int> v2(10, 0);vector<int> v3(v2.begin(), v2.end());for (size_t i = 0; i < v3.size(); i++){cout << v3[i] << ' ';}cout << endl;vector<int>::iterator it = v3.begin();while (it != v3.end()){cout << *it << ' ';++it;}cout << endl;
}
同样的我们首先要在vector类中声明并定义迭代器it,将v3的begin的位置给it,在while循环中依次将it解引用并输出,再对it进行++迭代,此时就完成了迭代器的遍历;

第一行的输出结果为for循环;第二行的结果为迭代器,他们都可以进行遍历;
在这里需要提醒大家的是迭代器中的begin或是end等等是指向数据的位置

所以这里我们可以将迭代器的功能理解为指针,遍历时将其解引用即可得到数据。
2.5.vector插入数据
如下是涉及到修改内容的函数

首先是尾插(push_back)
void test_vector8()
{vector<int> v;v.push_back(1);v.push_back(2);v.push_back(3);v.push_back(4);for (auto e : v){cout << e << ' ';}cout << endl;
}
int main()
{test_vector8();return 0;
}

结果不出所料,和我们在string中学到的插入方式相同;
同样的也有中间插入的方式insert,

可以看到有很多种插入的方式,这里简单使用

可以看到在begin 的位置之前插入了0;
那如何在以上数据的3的前面插入想要的数呢?
auto it = find(v.begin(), v.end(), 3);if (it != v.end());{v.insert(it, 30);}for (auto e : v){cout << e << ' ';}cout << endl;

这里我们就需要通过find来配合使用insert函数来查找并插入,结果如上;
2.6.扩容机制
不同平台扩容机制
接下来是有关容量的函数
我们首先来研究vector的扩容机制;
在string中我们了解到可以插入很多数据时,系统会自动扩容,在vector中也同样如此;我们用代码来了解一下vector的扩容机制
void test_vector5()
{size_t sz;vector<int> v;sz = v.capacity();for (size_t i = 0; i < 100; i++){v.push_back(i);if (sz != v.capacity()){sz = v.capacity();cout << "capacity changed" << sz << endl;}}
}
可以看到我我们在循环中给v插入数据,如果v的最大容量和插满数据时相同,系统就会自动扩容,此时我们再改变容量,并且标识出容量已经改变,那此时运行结果会是怎样呢?

我们可以看到大概是以原先容量的1.5倍进行扩容。
同样的代码我们在Linux系统下使用g++编译会有什么效果

可以看到对比vs环境下的1.5倍扩容,g++使用的是二倍扩容
reverse
其中还有reserve函数,他的作用是开辟空间,还是如上代码,我们使用reserve尝试一下
void test_vector6()
{size_t sz;vector<int> v;v.reserve(100);sz = v.capacity();for (size_t i = 0; i < 100; i++){v.push_back(i);if (sz != v.capacity()){sz = v.capacity();cout << "capacity changed" << sz << endl;}}
}
我们在它扩容之前使用reserve函数提前开好空间,运行结果如下

可以看到之前的扩容过程都不见了,原因是我们在扩容之前使用了reverse提前开了空间,将capacity修改成我们想要的,即可跳过在for循环中一边插入数据一边扩容的情况。
resize
resize不同于reserve的是,resize不仅可以改变capacity的大小,同时也可以改变size的大小,还是上段同样的代码,这里将reserve修改为resize来观察结果,
resize不仅可以修改容量的大小,还可以修改其本身的长度,这里的运行结果是在resize后的数据再进行插入,也就是说将两端数据接到一起。
还需要注意的一种情况如下

我们使用reserve直接开辟空间,然后直接去访问(利用for循环插入数据) reserve开辟的空间并打印是否可行呢?

结果是不行的,原因是这里访问v使用的是[ ],而在[ ]之前的模拟实现中,也就是它的底层逻辑是有assert断言的,条件是访问的下标必须小于size,而reserve只能修改capacity,不能修改size,所以就会报错。
那使用resize即修改size也修改capacity会怎样呢?

可以看到这样操作就很丝滑了。
以上就是本次要分享的内容,在vector中还有一些不常用的函数在这里没有深入分析到,还请感兴趣的同学们自行尝试,如果对你有所帮助还请多多三连支持,感谢您的阅读。
相关文章:
【C++】SLT——Vector详解
本片要分享的是关于STL中Vector的内容,Vector的内容于string非常相似,只要会使用string那么学习Vector时会非常流畅。 目录 1.vector介绍 2.vector的简单实用 2.1.简单的无参构造 编辑2.2.简单带参构造 2.3.迭代器区间初始化 2.4.vector的遍历 …...
企业网络安全:威胁情报解决方案
什么是威胁情报 威胁情报是网络安全的关键组成部分,可为潜在的恶意来源提供有价值的见解,这些知识可帮助组织主动识别和防止网络攻击,通过利用 STIX/TAXII 等威胁源,组织可以检测其网络中的潜在攻击,从而促进快速检测…...
为什么2G、3G、4G成功了,5G却?
你可能已经多年来一直听到关于闪电般的5G的炒作。虽然新的无线网络在美国仍然没有普及,但5G正在波士顿和西雅图到达拉斯和堪萨斯城等城市慢慢出现。随着连接速度的加快,用户的安全性和隐私保护将增加,因为无线行业试图改善3G和4G的防御。但是…...
C语言每日一练------Day(10)
本专栏为c语言练习专栏,适合刚刚学完c语言的初学者。本专栏每天会不定时更新,通过每天练习,进一步对c语言的重难点知识进行更深入的学习。 今日练习题关键字:自除数 除自身以外数组的乘积 💓博主csdn个人主页ÿ…...
发力服务业务,龙湖集团半程领跑赢在“智慧”
成立三十载,龙湖集团一直是房地产行业“特立独行”的存在。 一方面,龙湖在对外战略方面长期量入为出,从不背上过重的“包袱”。 不久前,一则消息引发市场关注:龙湖集团提前偿还17亿元债务,已基本全部还清…...
Kubernetes(七)修改 pod 网络(flannel 插件)
一、 提示 需要重启服务器 操作之前备份 k8s 中所有资源的 yaml 文件 如下是备份脚本,仅供参考 # 创建备份目录 test -d $3 || mkdir $3 # $1 命名空间 # $2 资源名称: sts deploy configMap svc 等 # $3 资源备份存放的目录名称for app in kubec…...
测试平台metersphere
metersphere可以做接口测试、UI测试、性能测试。 metersphere接口测试底层是jmeter,可以做API管理,快捷调试,接口用例管理,接口自动化场景执行一键选取用例范围,生成测试报告。 会用jmeter,metersphere会…...
论文笔记: One Fits All:Power General Time Series Analysis by Pretrained LM
1 intro 时间序列领域预训练模型/foundation 模型的研究还不是很多 主要挑战是缺乏大量的数据来训练用于时间序列分析的基础模型——>论文利用预训练的语言模型进行通用的时间序列分析 为各种时间序列任务提供了一个统一的框架 论文还调查了为什么从语言领域预训练的Transf…...
记录--怎么实现一个3d翻书效果
这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 本篇主要讨论以下两种翻书动画的实现: 第一种是整页翻转的效果: 这种整页翻转的效果主要是做rotateY的动画,并结合一些CSS的3d属性实现。 第二种折线翻转的效果&…...
(数字图像处理MATLAB+Python)第十一章图像描述与分析-第一节、二节:图像描述概述和特征点
文章目录 一:图像描述概述(1)图像描述(2)描述子 二:特征点(1)Moravec角点检测A:原理B:程序 (2)Harris角点检测A:原理B&…...
SSM框架的学习与应用(Spring + Spring MVC + MyBatis)-Java EE企业级应用开发学习记录(第五天)MyBatis的注解开发
SSM框架的学习与应用(Spring Spring MVC MyBatis)-Java EE企业级应用开发学习记录(第五天)MyBatis的注解开发 昨天我们深入学习了MyBatis多表之间的关联映射,了解掌握了一对一关联映射,一对多关联映射,嵌套查询方…...
VBA技术资料MF48:VBA_在Excel中将列号与字母转换
【分享成果,随喜正能量】除非自己的认知获得了改变和刷新,否则,人们常说的“顺应自己的内心”,顺的不过是一颗旧心,一颗惯性的,充满了各种习性的套路之心。与“顺应自己的内心”恰恰相反,人要用…...
LeetCode-160. 相交链表
这是一道真的非常巧妙的题,题解思路如下: 如果让他们尾端队齐,那么从后面遍历就会很快找到第一个相交的点。但是逆序很麻烦。 于是有一个巧妙的思路诞生了,如果让短的先走完自己的再走长的,长的走完走短的,…...
微信小程序如何实现页面传参和页面传递多个参数
前言 只要你的小程序超过一个页面那么可能会需要涉及到页面参数的传递,下面我总结了 4 种页面方法。 下面时多个参数页面传参的方式 let loveJSON.stringify(this.data.totle);let youJSON.stringify(this.data.totleId)let csdnJSON.stringify(this.data.totleP…...
ChatGPT⼊门到精通(3):ChatGPT 原理
OpenAI在2022年11⽉份发布ChatGPT,强⼤的⽂字对话、创意写作能⼒,全球掀起了⼀ 波AI浪潮。本⽂对ChatGPT的技术原理、厉害之处、可能的落地⽅向等⽅⾯进⾏了全⾯ 的解析,看完后会对ChatGPT有更深⼊的了解。 ⼀、前⾔ 2022年11⽉30⽇&#x…...
nginx配置keepalive长连接
nginx之keepalive详解与其配置_keepalive_timeout_恒者走天下的博客-CSDN博客 为什么要有keepalive? 因为每次建立tcp都要建立三次握手,消耗时间较长,所以为了减少tcp建立连接需要的时间,就可以设置keep_alive长连接。 nginx中keep_alive对…...
Thread.enumerate方法
Thread.enumerate方法的作用是将当前线程所对应的的线程组包含的所有线程放入一个数组 参见源码注释 /*** Copies into the specified array every active thread in the current* threads thread group and its subgroups. This method simply* invokes the {@link java.lan…...
* 号靠近数据类型,和靠近变量名, 号靠近数据类型,和靠近变量名,有什么区别
文章目录 一、int* age 和 int *age,* 号靠近数据类型,和靠近变量名,有什么区别:1. int* age:2. int *age: 二、int& age 和 int &age,& 号靠近数据类型,和靠近变量名,有什么区别&a…...
为了做好农业,拼多多请来顶尖农业专家当独立董事
8月29日,拼多多发布截至6月30日的2023年第二季度业绩报告。财报显示,拼多多集团今年第二季度收入为523亿元,同比增长66%,远超市场预期。 财报发布的同时,拼多多还宣布,其董事会已聘任荷兰瓦赫宁根大学终身…...
Linux服务器安装部署MongoDB数据库 – 【无公网IP远程连接】
文章目录 前言1.配置Mongodb源2.安装MongoDB数据库3.局域网连接测试4.安装cpolar内网穿透5.配置公网访问地址6.公网远程连接7.固定连接公网地址8.使用固定公网地址连接 前言 MongoDB是一个基于分布式文件存储的数据库。由 C 语言编写,旨在为 WEB 应用提供可扩展的高…...
数据清洗避坑指南:缺失值和异常值处理的5个常见错误(附真实案例)
数据清洗避坑指南:缺失值和异常值处理的5个常见错误(附真实案例) 在电商平台的用户行为分析中,我们曾遇到一个诡异现象:某促销活动页面的转化率突然飙升到98%。进一步排查发现,是爬虫程序将未加载完成的页…...
Repomix Git日志集成:掌握commit历史分析的终极指南
Repomix Git日志集成:掌握commit历史分析的终极指南 【免费下载链接】repomix 📦 Repomix (formerly Repopack) is a powerful tool that packs your entire repository into a single, AI-friendly file. Perfect for when you need to feed your codeb…...
Path of Building:流放之路玩家必备的终极Build规划神器
Path of Building:流放之路玩家必备的终极Build规划神器 【免费下载链接】PathOfBuilding Offline build planner for Path of Exile. 项目地址: https://gitcode.com/GitHub_Trending/pa/PathOfBuilding 如果你正在玩《流放之路》并为复杂的Build规划感到头…...
MacOS开发环境配置:OpenClaw+GLM-4.7-Flash联调指南
MacOS开发环境配置:OpenClawGLM-4.7-Flash联调指南 1. 为什么选择这个组合? 去年我在做一个自动化文档处理项目时,发现市面上的AI工具要么隐私性不足,要么灵活性太差。直到偶然接触到OpenClaw这个开源框架,才找到了理…...
Simcenter Amesim 2023与Matlab 2023a联合仿真:从环境配置到实战例程详解
1. 联合仿真环境搭建前的准备工作 在开始Simcenter Amesim 2023与Matlab 2023a的联合仿真之前,我们需要做好充分的准备工作。这就像盖房子前要打好地基一样重要,否则后续工作可能会遇到各种意想不到的问题。 首先说说硬件要求。根据我的实测经验…...
UG模型转STP后总出问题?可能是STEP 203和214版本没选对
UG模型转STP格式的深度选择指南:STEP 203与214版本差异解析 在工业设计领域,UG NX与STP格式的转换堪称日常操作,但许多工程师都曾遭遇这样的困境:明明转换过程一切顺利,接收方打开文件时却出现面片丢失、PMI信息异常甚…...
如何为Unity游戏实现实时翻译:XUnity Auto Translator完整指南
如何为Unity游戏实现实时翻译:XUnity Auto Translator完整指南 【免费下载链接】XUnity.AutoTranslator 项目地址: https://gitcode.com/gh_mirrors/xu/XUnity.AutoTranslator 你是否遇到过想玩一款优秀的Unity游戏,却发现它只支持日语或英语&am…...
从“炼丹”到“调参”:聊聊反向传播里那些容易被忽略的梯度细节(以PyTorch为例)
从“炼丹”到“调参”:聊聊反向传播里那些容易被忽略的梯度细节(以PyTorch为例) 在深度学习的世界里,反向传播算法就像炼金术士的魔法书,而梯度则是那些隐藏在公式背后的神秘力量。许多开发者能够熟练地调用.backward(…...
Anaconda+AKShare保姆级教程:5分钟搞定Python量化环境(附常见报错解决方案)
AnacondaAKShare极速配置指南:零基础搭建Python量化环境全攻略 刚接触量化投资的新手们,往往在第一步——环境搭建上就卡壳了。明明跟着教程一步步操作,却总是遇到各种报错提示,让人望而生畏。本文将手把手带你用Anaconda和AKSha…...
python-flask-djangol框架的关爱空巢老人和孩子留守儿童管理系统的设计和实现
目录需求分析与规划技术选型核心模块设计数据安全与权限开发与测试计划社区与可持续性项目技术支持源码获取详细视频演示 :文章底部获取博主联系方式!同行可合作需求分析与规划 明确系统核心功能模块:空巢老人健康监测、留守儿童学习与心理辅…...
