【C++】SLT——Vector详解

news2024/11/23 21:11:30

本片要分享的是关于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中还有一些不常用的函数在这里没有深入分析到,还请感兴趣的同学们自行尝试,如果对你有所帮助还请多多三连支持,感谢您的阅读。

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

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

相关文章

c++学习之vector的实现

在学习实现vector之前我们会看到对于库中的vector的实现&#xff0c;这里并非使用在学习string那样的定义方式&#xff0c;而是利用迭代器&#xff0c;也就是指针来实现的&#xff0c;这在功能的实现时极大的方便了我们。 那么我们就模仿库这样的方式实现我们呢经常会用到的一些…

Vision Transformer(vit)原理分析以及特征可视化

目录 Vit简介 Vit model结构图 vit输入处理 图像分块 class token与position的添加 特征提取 vit代码 Vit简介 Vision Transformer&#xff08;ViT&#xff09;是一种基于Transformer架构的深度学习模型&#xff0c;用于图像识别和计算机视觉任务。与传统的卷积神经网络…

【spring】一文带你弄懂Spring Bean的生命周期(超详细,超级通俗易懂!!)

目录 首先让我们来回顾一下Spring中的Bean是什么 Bean的生命周期 然后让我们由浅及深的对Bean的创建过程进行了解 首先来看最核心的五步骤 然后让我们逐层递进&#xff0c;学习一下七步骤版本吧 现在我们就可以进一步了解十步骤的版本&#xff08;完整的生命周期&#xff…

Java“牵手”1688商品列表数据,关键词搜索1688商品数据接口,1688API申请指南

1688商城是一个网上购物平台&#xff0c;售卖各类商品&#xff0c;包括服装、鞋类、家居用品、美妆产品、电子产品等。要获取1688商品列表和商品详情页面数据&#xff0c;您可以通过开放平台的接口或者直接访问1688商城的网页来获取商品详情信息。以下是两种常用方法的介绍&…

【Axure高保真原型】多图表动态切换

今天和大家分享多图表动态切换的原型模板&#xff0c;点击不同的图标可以动态切换对应的表&#xff0c;包括柱状图、条形图、饼图、环形图、折线图、曲线图、面积图、阶梯图、雷达图&#xff1b;而且图表数据可以在左侧表格中动态维护&#xff0c;包括增加修改和删除&#xff0…

【深度学习 | 核心概念】那些深度学习路上必经的核心概念,确定不来看看?(二)

&#x1f935;‍♂️ 个人主页: AI_magician &#x1f4e1;主页地址&#xff1a; 作者简介&#xff1a;CSDN内容合伙人&#xff0c;全栈领域优质创作者。 &#x1f468;‍&#x1f4bb;景愿&#xff1a;旨在于能和更多的热爱计算机的伙伴一起成长&#xff01;&#xff01;&…

信息化发展10

消费互联网基本属性 消费互联网具有的属性包括&#xff1a; 1 &#xff09; 媒体属性&#xff1a; 由自媒体、社会媒体以及资讯为主的门户网站。 2&#xff09; 产业属性&#xff1a; 由在线旅行和为消费者提供生活服务的电子商务等其他组成。 数字中国概览示意图 在党的十九…

设计模式行为模式-访问者模式

文章目录 介绍基本原理1. 定义访问者模式2. 角色及其职责2.1 元素&#xff08;Element&#xff09;2.2 具体元素&#xff08;ConcreteElement&#xff09;2.3 访问者&#xff08;Visitor&#xff09;2.4 具体访问者&#xff08;ConcreteVisitor&#xff09;2.5 对象结构&#x…

D-Link DCS 密码泄露漏洞

0x01 前言 本次测试仅供学习使用&#xff0c;如若非法他用&#xff0c;与本文作者无关&#xff0c;需自行负责&#xff01;&#xff01;&#xff01; 0x02 漏洞描述 D-link DCS是一款成像色彩为彩色 是一款网络摄像机。D-link DCS系统存在密码泄露漏洞&#xff0c;攻击者通过…

什么牌子的电容笔比较好?适合学生党的电容笔推荐

如今&#xff0c;几乎人手一部iPad平板&#xff0c;它能帮大家解决许多工作、学习方面的问题&#xff0c;例如在工作中整理文件&#xff0c;制作一些简单的PPT。因此&#xff0c;给iPad平板配上一个好的电容笔就显得尤为重要了。在此&#xff0c;我向各位安利一些又好用又便宜的…

【数据结构】多叉树转换为二叉树-c++代码实现-POJ 3437 Tree Grafting

文章目录 写这个题目的原因寻找提交网址题目解决思路AC代码成功AC 写这个题目的原因 1、今天在看王道考研数据结构的课&#xff08;虽然我要保研&#xff0c;但是因为这些看保研面试的时候会问&#xff0c;所以看一下嘞orz&#xff09;&#xff0c;看到了这个多叉树转换为二叉…

微信黑名单怎么恢复好友?1分钟教你找回消失的“他”

微信的【黑名单】功能可以屏蔽掉一些令大家分心或者浪费时间的人。这个功能有利于减少干扰、保护隐私&#xff0c;并且还能大大提高用户的社交体验。 但是&#xff0c;有时候大家可能会因为发生冲突而将对方暂时拉入黑名单。在问题得到解决后却又希望恢复与他的联系。那么&…

Seata整合nacos,Postgresql 为DB存储

Seata整合nacos,Postgresql 为DB存储 环境 详情环境可参考 https://github.com/alibaba/spring-cloud-alibaba/wiki/%E7%89%88%E6%9C%AC%E8%AF%B4%E6%98%8E 我这里 <spring.cloud.alibaba-version>2021.1</spring.cloud.alibaba-version>所有选择seata版本为 1…

模拟实现应用层协议

模拟实现应用层协议 文章目录 模拟实现应用层协议应用层再谈协议 序列化和反序列化 网络版计算器自定义协议利用Json进行序列化和反序列化json库的安装条件编译 应用层 应用层&#xff08;Application layer&#xff09;是OSI模型的第七层。应用层直接和应用程序接口并提供常见…

CountDownLatch详解——深入探究CountDownLatch源码

这篇文章将会详细介绍CountDownLatch这个并发类&#xff0c;通过深入底层源代码讲解其具体实现。 /*** A synchronization aid that allows one or more threads to wait until* a set of operations being performed in other threads completes.*/ 上面是CountDownLatch这个…

对SAE的测评报告

对SAE的测评报告&#xff1a; 很高兴在这里跟大家分享我对SAE产品的测评体验&#xff0c;以下我将通过实验以及本期话题的问题这两个方面带领大家走进SAE&#xff1a; 产品介绍&#xff1a; Serverless应用引擎SAE是一款极简易用、自适应弹性的容器化应用平台。它提供全托管…

C++ 动态多态(虚函数)

所谓动态多态即&#xff0c;在运行过程中&#xff0c;会随参数的变化而展现不同的功能&#xff0c;其关键原理便是虚函数&#xff0c;与之对应的静态多态便是函数重载。 虚函数&#xff0c;即当存在与虚函数一样的函数&#xff0c;即返回值&#xff0c;函数名&#xff0c;参数等…

【毕业设计】基于SSM的电子图书分享系统

前言 &#x1f525;本系统可以选作为毕业设计&#xff0c;运用了现在主流的SSM框架&#xff0c;采用Maven来帮助我们管理依赖&#xff0c;所选结构非常合适大学生所学的技术&#xff0c;本系统结构简单&#xff0c;容易理解&#xff01;本系统功能结构完整&#xff0c;非常高适…

回归预测 | MATLAB实现IBES-ELM改进的秃鹰搜索优化算法优化极限学习机多输入单输出回归预测(多指标,多图)

回归预测 | MATLAB实现IBES-ELM改进的秃鹰搜索优化算法优化极限学习机多输入单输出回归预测&#xff08;多指标&#xff0c;多图&#xff09; 目录 回归预测 | MATLAB实现IBES-ELM改进的秃鹰搜索优化算法优化极限学习机多输入单输出回归预测&#xff08;多指标&#xff0c;多图…

基于STM32的甲醛浓度检测报警仿真设计(仿真+程序+讲解)

仿真图proteus 8.9 程序编译器&#xff1a;keil 5 编程语言&#xff1a;C语言 设计编号&#xff1a;C0083 甲醛浓度检测报警仿真 1.主要功能2.仿真3. 程序4. 资料清单&下载链接 1.主要功能 功能说明&#xff1a; 1、以STM32单片机和控制核心设计甲醛浓度检测报警设计&…