C++----简单了解vector

news2025/4/17 5:30:12

       大家好,今天我们来讲讲与string相似的向量类型。之所以说他们是相似的原因是他们其中的数据类型有些效果都是一样的。当然大家不能说,既然是差不多的干嘛还有一个这个啊。不如直接用string就可以了。当然世界名言存在即合理。既然我们都能想到的东西,那些创始人大佬肯定也能想到这些。我自己认为的话:vector 是一个类模板,编译器根据模板创建类或函vector<string> 就是根据模板创建了若干 string 对象,而 string 本身可以包含字符串,字符串可以视为若干个字符,即,vector<string> 可以视为一个a [ ][ ] 数组。可以使用输出数组的方式来输出vector<string> 对象内的内容。但这些都不是我们这篇博客的主题。我们今天主要是想与大家分享一下,如何使用,好的吧。所以咧接下来我们来看看vector的一些用法。

vector的定义

        在我们上面的博客中我们先写string的定义构造的,那么我们这里也先写vector的定义够造。但大家都知道定义构造我们都是有模板的,编译器会根据我们的参数不同来构造不同的数据存储空间。那么我们先看看vector中的几个关键的定义模板:         大家看到上面的这个图片是不是觉得好熟悉啊,和string的有点像呀。这就是我们在序言中讲过的。string与vector是有点相似的。那么我们接下来看看这些都是怎么写的吧。

vector<int> first;                                // empty vector of ints
    vector<int> second(4, 100);                       // four ints with value 100
    vector<int> third(second.begin(), second.end());  // iterating through second
    vector<int> fourth(third);                       // a copy of third

        这里大家不用太纠结,大概知道如何使用和作用就行了。如果大家对我这里的理解不是太熟悉的话我会在博客末尾的地方将我们的vector的官网链接给大家。大家可以在用的时候,点那个链接找就可以了。

vector iterator 的使用

        大家可能看到这个小标题有点陌生但其实我们在string的时候就已经见过,并且使用过了,就是我们前面说过的迭代器。那么不知道大家对这个名词还有印象吗?如果在通透一点就是,我们前面将的begin和end。这个就叫迭代器。大家记住了,别忘了。后面要是有人说这个名词的话,大家不要二丈和尚摸不着头脑哈。大家也先先看看图片:

          我们还知道吧。我们普通的begin和end就是我们正常头尾。然后加个r就是相反的

         OK,当我们知道了vector的迭代器的作用,那么我们接下里就是我们写过代码的实现实例了。

void PrintVector(const vector<int>& v)
{
	// const对象使用const迭代器进行遍历打印
	vector<int>::const_iterator it = v.begin();
	while (it != v.end())
	{
		cout << *it << " ";
		++it;
	}
	cout << endl;
}

       大家可以结合我上一篇博客string一起来看看。

vector 空间增长问题

           接下来就是我们的数据空间相关的几个重要的关键词吧。我觉得这样讲也好理解。对于数据空间的关键词中我相信大家应该对size还有很深的影响吧。毕竟我们在c的时候想要获得数组的个数还是要写一串的哦。在c++的时候就只需要写这么几个就可以了。虽然我们开始是在string中学习的size。但是我们在前面也说过了。我们的vector与我们的string是有相似之处的。所以我们这里vector也是有size的。还有一些,大家看看下面的图片:

        这个大家要竖着看,别横着看哈。然后咧示例的话,大家看看下面的代码示例,应该也就了解的差不多了。

a.size(); //返回a中元素的个数;
a.capacity(); //返回a在内存中总共可以容纳的元素个数
a.resize(10); //将a的现有元素个数调至10个,多则删,少则补,其值随机
a.resize(10,2); //将a的现有元素个数调至10个,多则删,少则补,其值为2
a.reserve(100); //将a的容量(capacity)扩充至100,也就是说现在测试a.capacity();的时候返回值是100.这种操作只有在需要给a添加大量数据的时候才显得有意义,因为这将避免内存多次容量扩充操作(当a的容量不足时电脑会自动扩容,当然这必然降低性能) 

         这里还有一个点就是capacity的代码在vsg++下分别运行会发现,vscapacity是按1.5倍增长的,g++是按2倍增长的。这个问题经常会考察,不要固化的认为,vector增容都是2倍,具体增长多少是根据具体的需求定义的。就是说我们的vector在外面使用的时候会有一个大致的内存空间,然后我们使用的时候如果超了的话,那么就会默默的扩容,然后我们vs是扩的1.5倍。在linux是默认扩的2倍。所以当我们后面在使用voector的默认构造并且需要扩大容量的时候,最好先预定一下空间的大小,

        大家看看我们上面的图片,是一个对比图,一个是我们没有确定初始容量的,一个我们确定的容量的。大家不要觉得确定容量比较麻烦,但是当我们后面使用的时候就有大用的。

vector 增删查改 

        OK,了解了我们的空间增长问题后,我们就来学学修改空间数据的关键词。虽然我们在string的博客中没有提及,那时因为我觉得vector反正也会有相关知识的所以我就想大家先看看我发的那个链接看着,然后我在这一篇博客在说明一下,大家应该就理解的差不多了。那么我们这里就先来看看大概有哪几个关键词:

         也正是我们图片上讲的,我们在vector增删查改经常用的是我们的尾插尾删。和数组下标。这个理解起来大家肯定不会很难,因为我们在c的时候应该都模拟实现过,所以我们这里就不解释了,我们就直接看看例子:

void TestVector4()
{
	vector<int> v;
	v.push_back(1);
	v.push_back(2);
	v.push_back(3);
	v.push_back(4);
	auto it = v.begin();
	while (it != v.end()) 
	{
		cout << *it << " ";
		++it;
	}
	cout << endl;

	v.pop_back();
	v.pop_back();

	it = v.begin();
	while (it != v.end()) 
	{
		cout << *it << " ";
		++it;
	}
	cout << endl;
}
// 任意位置插入:insert和erase,以及查找find
// 注意find不是vector自身提供的方法,是STL提供的算法

          大家需要注意尾插与尾插开头写的是什么哈,别到时候记混了。到时候一编译牛头不对马嘴。但是我们大家需要注意一下

vector<int> a;
for(int i=0;i<10;i++)
    a[i]=i;这种做法以及类似的做法都是错误的。我们要记得下标只能用于获取已存在的元素,而现在的a[i]还是空的对象。
void TestVector6()
{
	vector<int> v{ 1, 2, 3, 4 };

	// 通过[]读写第0个位置。
	v[0] = 10;
	cout << v[0] << endl;

	// 使用for+[]小标方式遍历
	for (size_t i = 0; i < v.size(); ++i)
		cout << v[i] << " ";
	cout << endl;

	vector<int> swapv;
	swapv.swap(v);

	cout << "v data:";
	for (size_t i = 0; i < v.size(); ++i)
		cout << v[i] << " ";
	cout << endl;

}

总结

       我知道关于vector的内容还有很多,我们这里就简单的举了几个我们后面在学习的时候可能会经常用的的几个,这里是希望大家可以提前了解因为,知道大概有哪些和使用方法。并且我这个半吊子实操的也比较少所以这就算一个预习资料吧,然后就是大家想看vector的全部并且看看示例和解释的话,大家可以点击下面的链接,去学习学习:cplusplus.com/reference/vector/vector/

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

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

相关文章

Docker 部署 net6 webapi项目

摘要&#xff1a;记录 net6 webapi 项目在 docker 上部署步骤&#xff0c;方便自己后面查看&#xff0c;也方便他人学习。 1. 创建 webapi 项目 点击创建新项目 选择 ASP.NET Core Web API 项目&#xff0c;点击下一步。 给项目命名&#xff0c;然后勾选将解决方案和项目放在同…

C++初学(18)

18.1、读取数字的循环 假设要编写一个将一系列的数字读入到数组中的程序&#xff0c;并允许用户在数组填满之前结束输入。一种方法是利用cin&#xff1a; int n; cin>>n; 如果用户输入的是一个单词&#xff0c;而不是一个数字将会怎么样&#xff1f;可能会发生这些情况…

环境变量--永久 & 暂时

Linux 环境变量配置信息 查看环境变量 export 查看系统所有环境变量echo $PATH 查看 PATH 环境变量值 环境变量的命名规则为&#xff1a;变量名变量值 多个变量值之间使用 : 分隔 添加环境变量 环境变量分类 按照作用域分类 环境变量可以简单的分成用户自定义的环境变量…

OJ-0829

题目 示例1 输入&#xff1a; 5 4 1 1 2 3 5 1 2 3 1 4 3 4 5 2 3 4 输出&#xff1a; 3 4 1 2说明:测试用例的优先级计算如下: T1Pf1Pf2Pf31124 T2Pf1Pf4134 T3Pf3Pf4Pf523510 T4Pf2Pf3Pf41236 按照优先级从小到大&#xff0c;以及相同优先级&#xff0c;ID小的先执行的规则&…

#C++ 笔记三

七、异常处理 1.概念 异常是程序在执行期间产生的问题。 C异常是指在程序运行时发生的特殊情况&#xff0c;比如下标越界等。 异常提供了一种转移程序控制权的方式。 2.抛出异常 throw语句的操作数可以是任意表达式&#xff0c;表达式结果的类型决定了抛出异常的类型。 …

Elasticsearch Suggesters API详解与联想词自动补全应用

Elasticsearch Suggesters API详解与联想词自动补全应用 引言Elasticsearch Suggesters1. Term Suggester实现步骤示例 2. Phrase Suggester示例 3. Completion Suggester创建映射和插入数据查询示例 4. Context Suggester示例 Completion Suggester1. 工作原理2. 使用流程3. 使…

企业级低代码解决方案:JNPF平台深度解析

随着数字化转型的不断推进&#xff0c;企业对于快速开发、高效部署和灵活迭代的需求日益增长。低代码开发平台应运而生&#xff0c;成为加速企业应用开发的重要工具。在众多低代码平台中&#xff0c;JNPF凭借其强大的企业级特性脱颖而出&#xff0c;成为众多企业的首选。本文将…

【系统架构设计师-2019年】综合知识-答案及详解

文章目录 【第1题】【第2~3题】【第4题】【第5题】【第6~7题】【第8题】【第9~10题】【第11题】【第12题】【第13题】【第14题】【第15题】【第16~17题】【第18~19题】【第20~21题】【第22~23题】【第24~25题】【第26~28题】【第29~30题】【第31~32题】【第33题】【第34题】【第…

Java中三大容器类(List、Set、Map)详解

三大容器介绍 名称结构特点常见实现类List&#xff08;列表&#xff09;由有序的元素序列组成&#xff0c;可以包含重复元素可以通过索引访问元素&#xff0c;插入的顺序与遍历顺序一致ArrayList、LinkedList、VectorMap&#xff08;映射&#xff09;由键值对(Key-Value)组成的…

Axure 9 使用

一、界面初识 二、基础功能 1.菜单栏 1.1文件 新建文件&#xff1a;axure9包含四种文件.rp代表原型文件&#xff0c;.rplib代表元件库文件&#xff0c;.rpteam 团队项目文件 .html 网页文件 偏好设置&#xff1a;备份&#xff0c;需要备份文件再从备份中恢复 创建项目团…

GPT-SoVITS:零样本语音合成AI

GPT-SoVITS 是一种语音合成模型&#xff0c;于 2024 年 2 月 18 日发布。它支持使用参考音频进行零样本语音合成&#xff0c;并且可以进行微调以提高性能。 GPT-SoVITS 的功能特性包括&#xff1a; Zero-Shot TTS&#xff1a;零样本语音合成&#xff0c;输入 5 秒音频样本即可…

57.基于IIC协议的EEPROM驱动控制(4)

&#xff08;1&#xff09;顶层代码&#xff1a; module IIC_EEPROM(input wire clk ,input wire reset_n ,input wire key_r ,input wire key_w ,output wire …

DM一主一实时备一异步备守护集群安装

在前面章节中已经部署了一主一实时备机&#xff0c;此次实施过程中主要添加异步备库。 1. 环境描述 实例详情&#xff1a; 端口详情 2. 关闭主备库守护进程、监视器、数据库实例 [dmdbaray1 ]$ DmWatcherServiceDW stop Stopping DmWatcherServiceDW: …

基于ssm+vue+uniapp的图书管理系统小程序

开发语言&#xff1a;Java框架&#xff1a;ssmuniappJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包&#xff1a;M…

JVM 内存参数

文章目录 引言I JVM基础知识Java 语言是解释型的OpenJDK和Sun/Oracle JDK和hotspot的关系JDK、JRE、JVM 之间的关系JVM基础功能JVM组成JIT:Just In Time CompilerJVM内存区域JVM运行时数据区JVM 堆内存布局II JVM 内存参数常用参数JIT编译参数GC信息打印GC参数III 例子引言 J…

M2BEV

Part 1: 2D 图像编码器 给定 NNN 张大小为 HW3的图像&#xff0c;我们对所有图像使用共享的 CNN 主干网络进行前向传播&#xff0c;例如使用 ResNet&#xff0c;并通过特征金字塔网络&#xff08;FPN&#xff09;创建四级特征 F1,F2,F3,F4。 然后&#xff0c;将这些特征全部上…

Quartus网盘资源下载与安装 附图文安装教程

如大家所了解的&#xff0c;Quartus是一种FPGA设计软件&#xff08;相信理工科的小伙伴&#xff0c;很多都接触或学习过FPGA&#xff09;&#xff0c;旨在为数字电路设计师提供一个高效、便捷的开发环境。它可以帮助用户完成数字逻辑电路的设计、仿真、综合和布局&#xff0c;以…

webpack4手动搭建Vue项目

小满视频 很多解释使用通义灵码搜的,通义灵码的搜索结果也是有错误的全程使用pnpm包管理工具&#xff0c;和npm的用法基本一样 学习总结 1. 多看看webpack官网 2. webpack的作用&#xff1a;配置一堆东西&#xff0c;达到运行程序的目的 3. 无论什么东西都转成js&#xff0c;…

什么是CSRF跨站请求伪造

CSRF&#xff08;跨站请求伪造&#xff0c;Cross-Site Request Forgery&#xff09;是一种网络攻击&#xff0c;攻击者通过伪造用户的身份&#xff0c;诱使用户在已认证的 Web 应用上执行非预期的操作。CSRF 攻击的风险在于它能够利用用户的身份认证状态&#xff0c;从而执行恶…

app逆向1-实战里常见东西

幕布链接&#xff1a;app逆向1-实战里常见东西 - 幕布