vector容器 [上]
目录
一、 对于vector的介绍
二、vector的定义
0x01 无参构造
0x02 构造并初始化n个val
0x03 使用迭代器进行初始化构造
0x04 拷贝构造
0x05 比较
三、 vector的遍历
0x01 push_back()
0x02 operator[] 和at()
0x03 遍历
四、vector 容量空间
0x01 max_size : 返回vector可以容量的最大元素数
0x02 reserve : 容量改变
0x03 resize :改变个数
五、vector的增删改查
0x01 assign()
0x02 vector查找find()方法
0x03 Insert()
0x04 erase() 删除
0x05 clear()
一、 对于vector的介绍
参考: https://cplusplus.com/reference/vector/vector/
该网站的对于vector的中文介绍:
1.vector是表示可变大小数组的序列容器。
2.就像数组一样,vector也采用的连续存储空间来存储元素。也就是意味着可以采用下标对vector的元素进行访问,和数组一样高效。但是又不像数组,它的大小是可以动态改变的,而且它的大小会被容器自动处理。
3.本质讲,vector使用动态分配数组来存储它的元素。当新元素插入时候,这个数组需要被重新分配大小为了增加存储空间。其做法是,分配一个新的数组,然后将全部元素移到这个数组。就时间而言,这是一个相对代价高的任务,因为每当一个新的元素加入到容器的时候,vector并不会每次都重新分配大小。
4.vector分配空间策略:vector会分配一些额外的空间以适应可能的增长,因为存储空间比实际需要的存储空间更大。不同的库采用不同的策略权衡空间的使用和重新分配。但是无论如何,重新分配都应该是对数增长的间隔大小,以至于在末尾插入一个元素的时候是在常数时间的复杂度完成的。
5.因此,vector占用了更多的存储空间,为了获得管理存储空间的能力,并且以一种有效的方式动态增长。
6.与其它动态序列容器相比(deques, lists and forward_lists),vector在访问元素的时候更加高效,在末尾添加和删除元素相对高效。对于其它不在末尾的删除和插入操作,效率更低。比起lists 和 forward_lists统一的迭代器和引用更好。简而言之,vector是标准库所定义的一个容器,它是一个可以存放任意类型的动态数组
二、vector的定义
构造函数(constructor)声明:
0x01 无参构造
vector<int> x1;//只定义,但是没有进行初始化
0x02 构造并初始化n个val
vector<int> x2(5,4);//构造并初始化为5个4
0x03 使用迭代器进行初始化构造
vector<int> x3(++x2.begin(),--x2.end());//去掉一头一尾
0x04 拷贝构造
vector<int> x4(x3);//拷贝构造
0x05 比较
string s1("hello world"); vector<char> x5(s1.begin(),s1.end());
此时我们会想,上面的vector<char> 类型是否能替代string呢?
当然不能
角度一:string 的末尾带有'\0',但是从上图来看vector<char>并没有带'\0'角度二:string的接口,vector是否都有,从https://cplusplus.com/中参考,string所拥有的接口,vector并不是都有
三、 vector的遍历
0x01 push_back()
vector<int> x1;
x1.push_back(1);//尾插
x1.push_back(2);
x1.push_back(3);
0x02 operator[] 和at()
operator[]:
vector<int> x2;
x2.push_back(1);
x2.push_back(2);
x2.push_back(3);
x2.resize(1);
x2[2];
operator[]当越界的时候会进行断言
at():
vector<int> x2;
x2.push_back(1);
x2.push_back(2);
x2.push_back(3);
x2.resize(1);
x2.at(2);
at()当越界的时候会进行抛异常
0x03 遍历
vector的遍历主要有3种方式:
方式一: for循环
for (size_t i = 0;i < x1.size();i++)
{x1[i] += 1;cout << x1[i] << " ";
}
cout << endl;
方式二: 迭代器
vector<int>::iterator it = x1.begin();//内嵌类型
while (it != x1.end())
{*it -= 1;cout << *it << " ";++it;
}
cout << endl;
方式三:范围for
for (auto e: x1)
{cout << e << " ";
}
cout << endl;
上面三种遍历方式所得结果如下:
其次,我们可以知道的是原生指针就是一个天然的迭代器,数组支持范围for,那么就会被替换成指针
四、vector 容量空间
vector的容量空间主要学习一下5个接口:
0x01 max_size : 返回vector可以容量的最大元素数
vector<char> x1;
cout << x1.max_size() << endl;
vector<int> x2;
cout << x2.max_size() << endl;
0x02 reserve : 容量改变
vector<int> x1;
x1.reserve(100);//将x1的容量变为了100,但并没有进行初始化
0x03 resize :改变个数
vector<int> x2;
x2.resize(100);//改变个数并进行初始化,初始化值(第二个参数)也可以自己定义
并且如果改变的个数比当前个数小,也可以进行删除,但是其容量一般不会进行缩小:
vector<int> x2;
x2.push_back(1);
x2.push_back(2);
x2.push_back(3);//当前个数为3
x2.resize(1);//通过改变变为了1
五、vector的增删改查
0x01 assign()
介绍:将新内容指定给vector,替换其当前内容,并相应地修改其大小
vector<int> x1;
x1.push_back(1);
x1.push_back(2);
x1.push_back(3);
x1.assign(5,5);
0x02 vector查找find()方法
为什么vector中没有find(),因为如果有find(),那么应该也是从头找到尾,其复杂度应该是o(n)如果一定想用find()方法查找的话可以去<algorithm>库中使用,头文件是#include<algorithm>
该find()方法的参数分别是左右区间,左闭右开include<algorithm>
int main()
{vector<int> x1;x1.push_back(1);x1.push_back(2);x1.push_back(3);//vector<int>::iterator it = find(x1.begin(),x1.end(),2);//也可以用auto 进行推导auto it = find(x1.begin(), x1.end(), 2);if (it != x1.end()){cout << "找到了" << endl;}
}
0x03 Insert()
//用Insert()进行头插
int main()
{vector<int> x1;x1.push_back(1);x1.push_back(2);x1.push_back(3);for (auto e: x1){cout << e << " ";}cout << endl;x1.insert(x1.begin(),4);for (auto e : x1){cout << e <<" ";}cout << endl;
}
//在find()位置进行插入
int main()
{vector<int> x1;x1.push_back(1);x1.push_back(2);x1.push_back(3);for (auto e : x1){cout << e << " ";}cout << endl;auto it = find(x1.begin(), x1.end(), 2);if (it != x1.end()){cout << "找到了" << endl;x1.insert(it,4);}for (auto e : x1){cout << e << " ";}cout << endl;
}
0x04 erase() 删除
int main()
{vector<int> x1;x1.push_back(1);x1.push_back(2);x1.push_back(3);//先进行寻找vector<int>::iterator it = find(x1.begin(),x1.end(),3);//要进行判断,如果没有找到,那么it位置应该在end()位置,没有这个值就会出现问题if (it != x1.end()){x1.erase(it);}
}
如果没有找到要找的值,并且没有进行if判断,即让it位置在end()位置时:
int main()
{vector<int> x1;x1.push_back(1);x1.push_back(2);x1.push_back(3);//先进行寻找vector<int>::iterator it = find(x1.begin(),x1.end(),300);x1.erase(it);
}
0x05 clear()
介绍:从向量中删除所有元素(已销毁),即清除个数,但是容量不会改变
int main()
{vector<int> x1;x1.push_back(1);x1.push_back(2);x1.push_back(3);for (auto e : x1){cout << e << " ";}cout << endl;x1.clear();for (auto e : x1){cout << e << " ";}cout << endl;
}
显示结果如下:
相关文章:

vector容器 [上]
目录 一、 对于vector的介绍 二、vector的定义 0x01 无参构造 0x02 构造并初始化n个val 0x03 使用迭代器进行初始化构造 0x04 拷贝构造 0x05 比较 三、 vector的遍历 0x01 push_back() 0x02 operator[] 和at() 0x03 遍历 四、vector 容量空间 0x01 max_size : 返回v…...

React Native技术探究:开发高质量的跨平台移动应用的秘诀
作为一个跨平台移动应用开发框架,React Native在开发过程中能够有效提高开发效率、降低开发成本、缩短上线时间,因此备受开发者的欢迎。然而,如何使用React Native开发出高质量的跨平台移动应用呢?本文将探究这个问题,…...

C语言函数大全-- w 开头的函数(2)
C语言函数大全 本篇介绍C语言函数大全-- w 开头的函数 1. wcstok 1.1 函数说明 函数声明函数功能wchar_t *wcstok(wchar_t *wcs, const wchar_t *delim, wchar_t **ptr);用于将一个长字符串拆分成几个短字符串(标记),并返回第一个标记的地…...
kafka启动创建topic报错:zookeeper is not a recognized option
当前使用版本:kafka_2.13-3.4.0 使用老版本的创建topic的命令,是用zookeeper来创建,但是报错如下 D:\Software\Doument\kafka_2.13-3.4.0> .\bin\windows\kafka-topics.bat --create --zookeeper localhost:2181 --replication-factor 1 …...

11个超好用的SVG编辑工具
SVG的优势在于SVG图像可以更加灵活,自由收缩放大而不影响图片的质量,一个合适的SVG编辑工具能够让你的设计事半功倍,下面就一起来看看这些冷门软件好用在哪里。这11个超好用的SVG编辑工具依次为:即时设计、Justinmind、Sketsa SVG…...

低代码平台:10分钟从入门到原理
导航目录 一、低代码概念 二、优势及局限 三、基础功能及搭建 1、业务流程 2、用户权限 3、统计图表 四、使用感受 五、总结 传统的软件研发方式目前并不能很好地满足企业的需求:人员成本高、研发时间长、运维复杂。这时低代码工具的出现为快速开发软件提供…...
【JavaScript】如何获取客户端IP地址?
使用这个库:request-ip 它按照如下顺序获取请求的IP地址: X-Client-IPX-Forwarded-For (Header may return multiple IP addresses in the format: “client IP, proxy 1 IP, proxy 2 IP”, so we take the first one.)CF-Connecting-IP (Cloudflare)F…...

数据科学中使用的17 种相似性和相异性度量之欧氏距离
目录 1简介 2距离函数 2.1 L2范数(欧氏距离) 1简介 在数据科学中,相似性度量是一种衡量数据样本如何相互关联或相互接近的方法。另一方面,相异性度量是告诉数据对象有多少是不同的。此外,当相似的数据样本被分组到一…...

朋友去华为面试,轻松拿到30K的Offer,羡慕了......
最近有朋友去华为面试,面试前后进行了20天左右,包含4轮电话面试、1轮笔试、1轮主管视频面试、1轮hr视频面试。 据他所说,80%的人都会栽在第一轮面试,要不是他面试前做足准备,估计都坚持不完后面几轮面试。 其实&…...
MySQL入门第五课:数据更新
数据更新 1 插入 插入表数据 insert into 表名 (字段列表) values(值列表) insert into 表名 set 字段名1 值1,字段名2值2 插入多个数据 insert into 表名 values(值1,值2,值3.....) 这里面的值与列索引是对应的 显示表数据 select * fr…...

ALSA子系统(十八)------指纹解锁动画提示声卡顿问题解析
你好!这里是风筝的博客, 欢迎和我一起交流。 很久没写kernel相关的东西了,主要是来到手机厂之后,大部分还是在Android上,Kernel虽然也有涉及,但毕竟只是有所涉及,主要业务逻辑还是在HAL之上&am…...

[230513] TPO72 | 2022年托福阅读真题第1/36篇 | 10:45
Invading Algae 目录 Invading Algae 全文 题目 Paragraph 1 P1 段落大意 问题1 Paragraph 2 P2 段落大意 问题2 *问题3* Paragraph 3 P3 段落大意 问题4 Paragraph 4 P4 段落大意 Paragraph 5 P5 段落大意 *问题5* *问题6* 问题7 问题8 问题9…...

操作符详解
目录 操作符分类 算术操作符 - * / % 二进制 二进制总结 移位操作符(操作数只能为整数) << >> 位操作符(操作数必须为整数) & | ^ 面试题 赋值操作符 复合赋值符 单目操作符 单目操作符介绍…...

【MATLAB图像处理实用案例详解(16)】——利用概念神经网络实现手写体数字识别
目录 一、问题描述二、概念神经网络实现手写体数字识别原理三、算法步骤3.1 数据输入3.2 特征提取3.3 模型训练3.4 测试 四、运行结果 一、问题描述 手写体数字属于光学字符识别(Optical Character Recognition,OCR)的范畴,但分类…...
数据库管理-第六十九期 另一种累(20230422)
数据库管理 2023-04-22 第六十九期 另一种累1 国产数据库沟通2 问题3 我的建议总结 第六十九期 另一种累 Oracle 23c的相关内容先缓缓,有些数据库管理相关的还是得正式版发布后才好去做实验。这周相较于之前那种割接较多的累还有点不一样,这周陪着客户交…...

Cesium入门之六:Cesium加载影像图层(ArcGIS、Bing、Mapbox、高德地图、腾讯地图、天地图等各类影像图)
Cesium加载影像图层 一、ImageryLayer类常用属性常用方法 二、ImageryLayerCollection类常用属性常用方法 三、ImageryProvider类常用属性常用方法 四、ImageryProvider子类1. ArcGisMapServerImageryProvider加载ArcGIS地图服务 2. BingMapsImageryProvider加载BingMap地图服务…...

Redis系列--redis持久化
一、为什么需要持久化 redis本身运行时数据保存在内存中,如果不进行持久化,那么在redis出现非正常原因宕机或者关闭redis的进程或者关闭计算机后数据肯定被会操作系统从内存中清掉。当然,redis本身默认采用了一种持久化方式,即RD…...

在外Windows远程连接MongoDB数据库【无公网IP】
文章目录 前言1. 安装数据库2. 内网穿透2.1 安装cpolar内网穿透2.2 创建隧道映射2.3 测试随机公网地址远程连接 3. 配置固定TCP端口地址3.1 保留一个固定的公网TCP端口地址3.2 配置固定公网TCP端口地址3.3 测试固定地址公网远程访问 转载自远程内网穿透的文章:公网远…...

学网络安全怎么挖漏洞?怎么渗透?
前言 有不少阅读过我文章的伙伴都知道,我从事网络安全行业已经好几年,积累了丰富的经验和技能。在这段时间里,我参与了多个实际项目的规划和实施,成功防范了各种网络攻击和漏洞利用,提高了安全防护水平。 也有很多小…...

KL散度和交叉熵的对比介绍
KL散度(Kullback-Leibler Divergence)和交叉熵(Cross Entropy)是在机器学习中广泛使用的概念。这两者都用于比较两个概率分布之间的相似性,但在一些方面,它们也有所不同。本文将对KL散度和交叉熵的详细解释…...

C++ 求圆面积的程序(Program to find area of a circle)
给定半径r,求圆的面积。圆的面积应精确到小数点后5位。 例子: 输入:r 5 输出:78.53982 解释:由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982,因为我们只保留小数点后 5 位数字。 输…...
Java多线程实现之Thread类深度解析
Java多线程实现之Thread类深度解析 一、多线程基础概念1.1 什么是线程1.2 多线程的优势1.3 Java多线程模型 二、Thread类的基本结构与构造函数2.1 Thread类的继承关系2.2 构造函数 三、创建和启动线程3.1 继承Thread类创建线程3.2 实现Runnable接口创建线程 四、Thread类的核心…...

【JVM面试篇】高频八股汇总——类加载和类加载器
目录 1. 讲一下类加载过程? 2. Java创建对象的过程? 3. 对象的生命周期? 4. 类加载器有哪些? 5. 双亲委派模型的作用(好处)? 6. 讲一下类的加载和双亲委派原则? 7. 双亲委派模…...
站群服务器的应用场景都有哪些?
站群服务器主要是为了多个网站的托管和管理所设计的,可以通过集中管理和高效资源的分配,来支持多个独立的网站同时运行,让每一个网站都可以分配到独立的IP地址,避免出现IP关联的风险,用户还可以通过控制面板进行管理功…...
Leetcode33( 搜索旋转排序数组)
题目表述 整数数组 nums 按升序排列,数组中的值 互不相同 。 在传递给函数之前,nums 在预先未知的某个下标 k(0 < k < nums.length)上进行了 旋转,使数组变为 [nums[k], nums[k1], …, nums[n-1], nums[0], nu…...
【实施指南】Android客户端HTTPS双向认证实施指南
🔐 一、所需准备材料 证书文件(6类核心文件) 类型 格式 作用 Android端要求 CA根证书 .crt/.pem 验证服务器/客户端证书合法性 需预置到Android信任库 服务器证书 .crt 服务器身份证明 客户端需持有以验证服务器 客户端证书 .crt 客户端身份…...
WEB3全栈开发——面试专业技能点P4数据库
一、mysql2 原生驱动及其连接机制 概念介绍 mysql2 是 Node.js 环境中广泛使用的 MySQL 客户端库,基于 mysql 库改进而来,具有更好的性能、Promise 支持、流式查询、二进制数据处理能力等。 主要特点: 支持 Promise / async-await…...

2025年- H71-Lc179--39.组合总和(回溯,组合)--Java版
1.题目描述 2.思路 当前的元素可以重复使用。 (1)确定回溯算法函数的参数和返回值(一般是void类型) (2)因为是用递归实现的,所以我们要确定终止条件 (3)单层搜索逻辑 二…...

基于Python的气象数据分析及可视化研究
目录 一.🦁前言二.🦁开源代码与组件使用情况说明三.🦁核心功能1. ✅算法设计2. ✅PyEcharts库3. ✅Flask框架4. ✅爬虫5. ✅部署项目 四.🦁演示效果1. 管理员模块1.1 用户管理 2. 用户模块2.1 登录系统2.2 查看实时数据2.3 查看天…...
基于Java项目的Karate API测试
Karate 实现了可以只编写Feature 文件进行测试,但是对于熟悉Java语言的开发或是测试人员,可以通过编程方式集成 Karate 丰富的自动化和数据断言功能。 本篇快速介绍在Java Maven项目中编写和运行测试的示例。 创建Maven项目 最简单的创建项目的方式就是创建一个目录,里面…...