C++ —— 关于vector

news2024/11/14 13:39:21

目录

链接

1. vector的定义

2. vector的构造

3. vector 的遍历

4. vector 的扩容机制

5. vector 的空间接口

5.1 resize 接口  

 5.2 push_back

5.3 insert 

5.4 erase

5.5 流插入与流提取  

vector 并不支持流插入与流提取,但是可以自己设计,更加灵活方便

6. vector 的不同类型元素 


链接

cplusplus.com/reference/vector/vector/icon-default.png?t=O83Ahttps://cplusplus.com/reference/vector/vector/


1. vector的定义

(constructor)构造函数声明接口说明
vector()无参构造
vector(size_type n, const value_type& val =
value_type())
构造并初始化n个val
vector (const vector& x);拷贝构造
vector (InputIterator first, InputIterator last);使用迭代器进行初始化构

 

2. vector的构造

//模版类只能显式实例化
vector<int> v1;
vector<int> v2(10, 1);

//迭代器初始化
vector<int> v3(v2.begin(), v2.end());
vector<int> v4(++v2.begin(), --v2.end());

 


3. vector 的遍历

vector 与 string 的遍历相同,并且做了更多的优化

void test_vector1()
{
	vector<int> v1;
	vector<int> v2(10, 1);

	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;

    // 范围 for 遍历
	for (auto e : v3)
	{
		cout << e << " ";
	}
	cout << endl;
}


4. vector 的扩容机制

vector 的扩容机制在 VS 环境下是1.5倍扩容,在 g++ 环境下是2倍扩容,和string相同

但是有一点不同:

那就是string 的 reverse 接口如果给出的值小于原来的容量那么就可能会缩容,但是 vector 的 reverse 接口如果给出一个小于原容量的值就不会缩容

 

void TestVectorExpend()
{
	size_t sz;
	vector<int> v;
	sz = v.capacity();
	cout << "capacity changed :" << sz << "\n";
	cout << "make a grow" << endl;
	for (size_t i = 0; i < 100; i++)
	{
		v.push_back(i);
		if (sz != v.capacity())
		{
			sz = v.capacity();
			cout << "capacity changed :" << sz << "\n";
		}
	}
}


5. vector 的空间接口

size获取数据个数
capacity获取容量大小
empty判断是否为空
resize改变vector的size
reserve 改变vector的capacity

5.1 resize 接口  

 resize 接口是在原来 vector 对象的基础上进行添加数据

当然有两种情况:

一种是添加数据容量小于原来的size,就会减小size的值而不改变capacity的值(容量不变)

第二种情况就是大于size的值,就会根据给定的值来扩容

vector<int> v(10, 1);
cout << v.size() << endl;
cout << v.capacity() << endl;

//小于size
v.resize(5, 2);
cout << v.size() << endl;
cout << v.capacity() << endl;
 
//大于size
v.resize(15, 2);
cout << v.size() << endl;
cout << v.capacity() << endl;

 


void test_vector3()
{
    //10个整形数据1
	vector<int> v(10, 1);
    //申请20空间
	v.reserve(20);
	cout << v.size() << endl;
	cout << v.capacity() << endl;

    //10个整形数据1,补上5个整形数据2
	v.resize(15, 2);
	cout << v.size() << endl;
	cout << v.capacity() << endl;

    //10个整形数据1,5个整形数据2,补上10个整形数据3
	v.resize(25, 3);
	cout << v.size() << endl;
	cout << v.capacity() << endl;
    
    //只保留5个数据
	v.resize(5);
	cout << v.size() << endl;
	cout << v.capacity() << endl;
}

 


                                                通常 vector 支持迭代器插入


 5.2 push_back

//尾插
vector<int> v(10, 1);
v.push_back(10);
for (auto e : v)
{
	cout << e << " ";
}
cout << endl;


5.3 insert 

//头插
vector<int> v(10, 1);
v.insert(v.begin(), 1);
for (auto e : v)
{
	cout << e << " ";
}
cout << endl;

//第一个数+3之后在第三个位置进行插入
v.insert(v.begin() + 3, 1);
for (auto e : v)
{
	cout << e << " ";
}

5.4 erase

删除指定位置的数据

//头删
vector<int> v(10, 1);
v.erase(v.begin());
for (auto e : v)
{
	cout << e << " ";
}
cout << endl;

//第一个数+3之后删除第三个位置的数据
v.erase(v.begin() + 3);
for (auto e : v)
{
	cout << e << " ";
}
cout << endl;

 


5.5 流插入与流提取  

vector 并不支持流插入与流提取,但是可以自己设计,更加灵活方便

vector<int> v(10);
for (size_t i = 0; i < v.size(); i++)
{
	cin >> v[i];
}
for (auto e : v)
{
	cout << e << " ";
}
cout << endl;


6. vector 的不同类型元素 

vector不光可以存储int,double类型,还可以存储日期类,string,自定义类型,甚至还可以存储vector(也就是存储二维数组)

 

vector<vector<int>>:二维数组存放整数类型

 

 

 


	//二维数组
    //5个元素的一维数组
	vector<int> v(5, 1);
    //开辟一个10行5列的二维数组
	vector<vector<int>> vv(10, v);

    vv[2][1]=1;
    //这两段代码的意思是相同的
    //vv.operator[](2)operator[](1)=2;

 遍历

 
	//二维数组
    //5个元素的一维数组
	vector<int> v(5, 1);
    //开辟一个10行5列的二维数组
	vector<vector<int>> vv(10, v);

	//使用下标遍历二维数组
	for (int i = 0; i < vv.size(); i++)
	{
		for (int j = 0; j < v.size(); j++)
		{
			cout << vv[i][j] << " ";
		}
		cout << endl;
	}

 

 


感谢观看~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2147096.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

[NSSCTF 2022 Spring Recruit]ezgame

打开题目环境是一个游戏: 直接F12开始审计源代码&#xff1a; 这里说拿到65分以后可以得到flag&#xff0c;这里因为游戏太菜选择直接篡改分数&#xff1a; 在控制台输入scorePoin10000就可以改变当次得分&#xff0c;等到游戏结束就能得到flag。

心觉:成功学就像一把刀,有什么作用关键在于使用者(二)

Hi&#xff0c;我是心觉&#xff0c;与你一起玩转潜意识、脑波音乐和吸引力法则&#xff0c;轻松掌控自己的人生&#xff01; 挑战每日一省写作174/1000天 上一篇文章讲了成功学到底是个啥 是如何起作用的 为什么有些人觉得没有用&#xff1f; 今天我们再展开来剖析一下这…

链表--(1)链表的概念

前言引入 之前我们学习了数组这一概念,使用数组可以在编程时增加程序的灵活性。但在c语言中不允许定义动态数组的类型也不能随意调整数组的大小,往往会导致内存空间的浪费。由此我们推出链表。链表是动态进行内存分配的一种结构,它可以随时为其结点分配需要的存储空间也方便…

Vscode搭配latex简易教程

1. 找镜像网站下载texlive的iso文件 清华源镜像 下载之后直接打开iso文件&#xff0c;打开install-tl-windows.bat文件&#xff0c;进行安装即可&#xff0c;安装大概30分钟左右 2. VScode端配置 2.1 下载这三个插件 2.2 打开设置 2.3 追加内容到配置json文件当中 // Latex…

《深入理解JAVA虚拟机(第2版)》- 第12章 - 学习笔记

第12章 Java内存模型与线程 12.1 概述 TPS是用来衡量一个服务性能好坏高低的重要指标值。TPS是Transactions Per Second的缩写&#xff0c;用来表示每秒事务处理数&#xff0c;即服务端每秒平均能碰响应的请求数。 12.2 硬件的效率与一致性 处理器与内存的运算效率差了好几…

使用阿里OCR身份证识别

1、开通服务 免费试用 2、获取accesskay AccessKeyId和AccessKeySecret 要同时复制保存下来 因为后面好像看不AccessKeySecret了 3.Api 参考 https://help.aliyun.com/zh/ocr/developer-reference/api-ocr-api-2021-07-07-recognizeidcard?spma2c4g.11186623.0.0.7a9f4b1e5C…

园区网基础组网保姆级(mstp,vrrp,irf,eth-trunk,route-policy,ospf,bgp,rbm,nat,mlag等等)

本文实验使用模拟器:H3C HCL 5.10.2版本 一、园区核心/接入架构1.1.三层架构1.2.二层架构二、园区核心 To 接入实践2.1.MSTP+VRRP派系2.1.1.MSTP+VRRP配置2.1.2.MSTP+VRRP验证2.2.IRF+Eth-Trunk派系2.2.1.IRF+Eth-Trunk配置2.3.两种派系的对比2.4.VXLAN结构三、园区核心/出口架…

观《中国数据库前世今生》有感:从历史中汲取未来的力量

观《中国数据库前世今生》有感&#xff1a;从历史中汲取未来的力量 中国数据库技术的起步与发展 观看了《中国数据库前世今生》后&#xff0c;我对于中国数据库技术的历史变迁有了更深刻的理解。作为一名有一年开发经验的程序员&#xff0c;这部纪录片让我对中国数据库行业从8…

828华为云征文 | 云服务器Flexus X实例,搭建上线前后端项目

828华为云征文 | 云服务器Flexus X实例&#xff0c;搭建上线前后端项目 项目搭建 演示使用华为云服务器Flexus X实例搭建上线前后端项目黑马vue电商后台管理系统 项目GitHub链接&#xff1a;https://github.com/Minori-ty/vue_shop.git 1、购买华为云 Flexus X 实例 Flexus云服…

.Net Core 生成管理员权限的应用程序

创建一个ASP.NET Core Web API项目 给解决方案设置一个名称 选择一个目标框架&#xff0c;这里选择的是 .NET 8.0框架 在Porperties文件夹中添加一个app.manifest文件 设置app.manifest文件属性&#xff0c;生成操作设置为嵌入的资源 双击解决方案名称&#xff0c;编辑WebAppli…

JS实现树形结构数据中特定节点及其子节点显示属性设置的技巧(可用于树形节点过滤筛选)

大家好&#xff0c;今天我要分享的是如何在树形结构的数据中&#xff0c;根据特定条件设置节点及其所有子节点的显示属性。在实际项目中&#xff0c;这种需求非常常见&#xff0c;特别是在需要动态展示和隐藏节点的情况下。下面我将通过一个具体的示例来讲解实现过程。 需求分析…

(史上最全)线程池

线程池 文章目录 线程池一&#xff0c;前言二&#xff0c;线程池三&#xff0c;参数四&#xff0c;线程池的实现原理5.线程池的使用案例(自定义线程池)6.使用Executors 创建常见的功能线程池1.固定大小线程池2.定时线程3.可缓存线程池4.单线程化线程池 一&#xff0c;前言 虽然…

Prometheus 上手指南

文章目录 Prometheus 相关概念Prometheus 的特点Prometheus 架构数据模型 Datemode使用场景 指标类型 Metric type适用场景 作业和实例 Jobs and instances使用场景 Prometheus 安装Prometheus 配置prometheusalertmanager Grafana 可视化Grafana 安装Grafana 配置选项Grafana …

假期学习--iOS 编译链接

iOS 编译链接 编译流程 四步&#xff1a; 1.预处理 2.编译 3.汇编 4.链接 大概的步骤如下&#xff1a; 预处理 作为编译的第一步&#xff0c;将.m文件转换为.i文件 &#xff1b; 预处理是要处理源代码中所有以#开头的所有预编译指令 &#xff1b; 规则如下&#xff1…

更换UFS绑定固件与“工程固件”的区别 小米10s机型更换cpu绑定包对比 写入以及修复基带

目前机型的安全机制越来越高。机型cpu与字库存在绑定关系。主板cpu如损坏需要更换。换新cpu后就需要刷写底层绑定包来修复 。今天的博文将为大家带来UFS绑定包与工程固件的区别以及写入 修复基带的步骤解析 通过博文了解 1💝💝💝-----更换UFS绑定包与工程固件的区别 2…

利士策分享,赚钱与体重:一场关于生活平衡的微妙探索

利士策分享&#xff0c;赚钱与体重&#xff1a;一场关于生活平衡的微妙探索 在当今社会&#xff0c;赚钱与体重&#xff0c;这两个看似风马牛不相及的概念&#xff0c; 却在无形中交织着人们的生活轨迹。 它们不仅仅是数字上的增减&#xff0c;更是个人选择、生活方式乃至心理…

Mycat搭建分库分表

分库分表解决的问题 单表数据量过大带来的性能和存储容量的限制的问题&#xff1a; 索引效率下降读写瓶颈存储容量限制事务性能问题分库分表架构 再搭建一对主从复制节点&#xff0c;3307主节点&#xff0c;3309从节点配置数据源 dw1 , dr1,创建集群c1创建逻辑库 CREATE DATAB…

【AI小项目6】QLoRA针对资源受限设备上的大模型微调和文本分类任务的推理

目录 一、项目简介概述时间主要工作和收获技术栈数据集结果参考 二、训练阶段的完整代码什么是 QLoRA 微调&#xff1f;注意 安装库导入包配置定义一个Config类配置训练参数配置Lora 初始化分词器和模型数据预处理计算模型评估指标交叉验证划分数据集举例&#xff1a; 创建Trai…

Redis-分片集群

分片集群 主从和哨兵可以解决高可用、高并发读的问题。但是依然有两个问题没有解决&#xff1a; 海量数据存储问题 高并发写的问题 使用分片集群可以解决上述问题&#xff0c;如图: 分片集群特征&#xff1a; 集群中有多个master&#xff0c;每个master保存不同数据 每个ma…

Java-测试-Mockito 入门篇

之前很长一段时间我都认为测试就是使用SpringBootTest类似下面的写法&#xff1a; SpringBootTest class SysAuthServiceTest {AutowiredSysRoleAuthMapper sysRoleAuthMapper;Testpublic void test() {QueryWrapper<SysRoleAuth> queryWrapper new QueryWrapper<&g…