【C++】STL标准库之vector

STL标准库之vector

  • vector类的简介
  • 常用的vector类的接口
    • 构造
    • 容量
    • 遍历及访问
    • 增删查改
    • 迭代器
    • 迭代器失效问题

vector类的简介

vector是大小可变数组的序列容器,与string相比,vector中可以存任何类型的数据,而string中存储的只能是字符类型。
因为vector采用的是连续存储空间,因此它也可以通过下标对vector中的元素进行访问,而它比数组的优势在于,它的大小是可以动态改变的,它的大小会被容器自动处理。
在插入新元素的时候,并没有使用常规的开辟新数组,拷贝元素,释放旧空间,而是会以空间换取时间的方式,事先多分配一部分空间,以便于未来可能会增加的元素

常用的vector类的接口

构造

函数名称功能
vector()无参构造
vector(size_t n, const value_t& val = val_type())构造并初始化n个val
vector(const vector& v)拷贝构造
vector(InputIterator first, InputIterator last)使用迭代器进行构造

对应写法

vector<int> v();
vector<int> v1(5, 10);
vector<int> v2(v);
vector<int> v3(v1.begin(), v1.begin()+5);

注意:vector是一个类模板,需要在构造时进行类型定义。
而在c++11中,还可以用数组直接进行构造 vector v(1,2,3,4,5);

容量

函数名称功能
size获取元素个数
capacity获取当前容量大小
empty判断当前vector是否为空
resize改变vector中有效元素的个数
reserve改变容量大小(只增不减)

当前的容量部分的函数实际上和string的非常相似,但是string在resize中由于内部存在的数组,与vector稍微不同
我们在扩容时,vs下是以1.5倍来扩容的,g++是按2倍来扩容的。如果事先知道vector中大概要存放多少个元素,可以先对其进行扩容,这样就能够避免边插入边扩容的问题了。

遍历及访问

函数名称功能
operator[]访问元素
at访问元素
front访问第一个元素
back访问最后一个元素

请注意:访问元素有以下几种访问方式

//auto遍历
for(auto : e : v2)
{
	cout << e << " ";
}
cout << endl;
//下标遍历
for (size_t i = 0; i < v1.size(); ++i)
{
	cout << v1[i] << " ";
}
cout << endl;
//正向迭代器遍历
auto it = v1.begin();
while (it != v1.end())
{
	cout << *(it) << " ";
	++it;
}
cout << endl;
//反向迭代器遍历
auto rit = v1.rbegin();
while(rit != v..rend())
{
	cout << *(rit) << " ";
	++rit;
}
cout << endl;

增删查改

函数名称功能
push_back尾插
pop_back尾删
find查找(是算法模块实现的,不是vector的成员函数)
insert在pos前插入val
erase删除pos位置的数据
swap交换两个vector的数据空间
operator[]像数组一样通过下标访问

迭代器

在这里插入图片描述
如当前图片所示:begin是在当前vector中的第一个元素的位置,end在当前vector最后一个元素的下一个位置,而反向迭代器正好相反。

迭代器失效问题

如果我们写这样一个代码

在这里插入图片描述

当程序执行到第14行时,直接奔溃了。这是什么原因呢?

实际上和当前这个迭代器有关,当前迭代器我们可以将其理解为是一个指针,当前指针本来指向的是vector的第一个元素的位置,而我们将其扩容后,实际上在底层经历了开辟新空间,拷贝元素,释放旧空间三个步骤,当这三个步骤结束后,原本指向第一个元素的指针已经失去了意义,成为了野指针,我们要访问这个野指针程序就会奔溃。因为我们使用的是一块已经被释放的空间。

如果总结下来:有以下几种情况可能会导致迭代器失效
1.会引起底层空间发生改变的操作:resize,reserve,insert,assign,push_back
2.指定位置删除元素

int main()
{
	vector<int> v{1,2,3,4,5,6};

	auto pos = find(v.begin(), v.end(), 5);
	v.erase(pos);
	cout << *(pos) << endl;
	return 0;
}

针对上述迭代器失效的解决办法,第一种情况,我们要在使用迭代器之前再次对迭代器进行赋值
第二种情况,我们要在使用erase时去接收返回值。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

asp.net基于web的音乐管理网站dzkf17A9程序

本系统主要包含了等系统用户管理、公告信息管理、音乐资讯管理、音乐类型管理多个功能模块。下面分别简单阐述一下这几个功能模块需求。 管理员的登录模块&#xff1a;管理员登录系统对本系统其他管理模块进行管理。 用户的登录模块&#xff1a;用户登录本系统&#xff0c;对个…

真题详解(有向图)-软件设计(六十二)

真题详解&#xff08;极限编程&#xff09;-软件设计&#xff08;六十一)https://blog.csdn.net/ke1ying/article/details/130435971 CMM指软件成熟度模型&#xff0c;一般1级成熟度最低&#xff0c;5级成熟度最高&#xff0c;采用更高级的CMM模型可以提高软件质量。 初始&am…

Spring框架中的单例Beans是线程安全的么?

在Spring框架中&#xff0c;单例Beans默认是线程安全的。 当你在Spring框架中声明一个单例Bean并配置为默认的单例作用域时&#xff0c;Spring会确保对该Bean的并发访问是线程安全的。以下是一个简单的代码演示&#xff1a; 假设我们有一个名为 SingletonBean 的单例 Bean 类…

看看人家的MyBatis批量插入数据优化,从120s到2.5s,那叫一个优雅!

粗略的实验 最后 最近在压测一批接口的时候&#xff0c;我发现接口处理速度比我们预期的要慢。这让我感到有点奇怪&#xff0c;因为我们之前已经对这些接口进行了优化。但是&#xff0c;当我们进行排查时&#xff0c;发现问题出在数据库批量保存这块。 我们的项目使用了 myb…

Java使用 Scanner连续输入int, String 异常错误输出原因分析

目录 一、Scanner常用语法 1、sc.nextInt()介绍 2、sc.next()介绍 3、sc.nextLine()介绍 4、sc.hasNext()介绍 二、报错案例 1、使用next()来接收带有空格的字符串会输出异常 2、先输入数字再输入字符串的输出异常 一、Scanner常用语法 Scanner sc new Scanner(System.…

零基础学会 Java,这是你需要按照学习的步骤,加油,新加入的你

学习 Java 需要遵循一定的步骤&#xff0c;首先需要学习计算机基础知识&#xff0c;例如算法、数据结构、计算机组成原理等。如果没有相关背景知识&#xff0c;可以参加计算机相关课程进行学习。其次是学习编程基础知识&#xff0c;例如控制流、变量、函数等&#xff0c;你可以…

@Autowired和@Resource注解之间的关系区别,Bean的作用域和生命周期,Spring的执行流程

目录 一. Autowired 和 Resource 注解 二. Bean的作用域 1. singleton(单例模式) 2. prototype(原型模式)(多例模式) 3. 请求作用域&#xff1a;request 4. 会话作用域&#xff1a;session 三. Spring 的执行流程 四. Bean 的生命周期 1. 实例化 2. 设置属性 3. Bea…

函数的栈帧与销毁(栈帧可不是战争哦)

&#x1f929;本文作者&#xff1a;大家好&#xff0c;我是paperjie&#xff0c;感谢你阅读本文&#xff0c;欢迎一建三连哦。 &#x1f970;内容专栏&#xff1a;这里是《C语言》专栏&#xff0c;笔者用重金(时间和精力)打造&#xff0c;将C语言知识一网打尽&#xff0c;希望可…

【算法】最容易懂得的红黑树

红黑树是一个平衡的二叉树&#xff0c;但不是一个完美的平衡二叉树。虽然我们希望一个所有查找都能在~lgN次比较内结束&#xff0c;但是这样在动态插入中保持树的完美平衡代价太高&#xff0c;所以&#xff0c;我们稍微放松逛一下限制&#xff0c;希望找到一个能在对数时间内完…

PS学习笔记(零基础PS学习教程)

很多新手学习PS不知从何下手&#xff0c;做设计的第一阶段肯定是打牢基础&#xff0c;把工具用熟练&#xff1b;本期特别为大家整理了PS入门的学习笔记&#xff0c;把每个工具的用法整理了下来&#xff0c;在使用过程中有哪里不清楚的可以翻看来看看~ 一、ps的工作界面的介绍 …

Python程序员想要转行,可以从这几个方面着手

最近有很多朋友问我一个问题&#xff0c;不论是我们做程序员还是做产品经理或者其他行业&#xff0c;到了30岁或35岁之后&#xff0c;都会面临各种各样的问题&#xff0c;比如达到职业天花板。有没有一种方法能够解决这种问题呢&#xff1f;我想分享一下我的观点和身边的案例。…

网络攻击与防御

1.什么是数据认证&#xff0c;有什么作用&#xff0c;有哪些实现的技术手段? 数字认证证书它是以数字证书为核心的加密技术可以对网络上传输的信息进行加密和解密、数字签名和签名验证&#xff0c;确保网上传递信息的安全性、完整性。 使用了数字证书&#xff0c;即使您发送的…

ChatGPT是什么?ChatGPT里的G、P、T分别指什么

文章目录 ChatGPT是什么GTP中的 生成式 是什么意思GTP中的 预训练 是什么意思GTP中的 变换模型 是什么意思 什么是Transformer什么是注意力机制 监督学Xi、无监督学Xi、强化学Xi ChatGPT是什么 GPT: Generative Pre-trained Transformer 生成式预训练变换模型 ChatGPT是由Ope…

用ChatGPT问DotNet的相关问题,发现DotNet工程师的前景还不错

本人最近费了九牛二虎之力注册了一个ChatGPT账号&#xff0c;现在就给大家分享一下&#xff0c;问一下关于.NET的问题&#xff0c;看看ChatGPT的AI功能具体如何&#xff1f; 一、C#跟其它语言比较的优势 回答&#xff1a; C#是一门编程语言&#xff0c;它是为 Microsoft 的 …

第十三章 移动和旋转(上)

移动和旋转是游戏对象最频繁地操作。我们上个章节简单介绍了Cube的移动和旋转。移动是修改transform的position属性&#xff0c;旋转是修改transform的eulerAngles&#xff08;欧拉角&#xff09;属性&#xff0c;两者属性值均可以使用Vector3向量来实现。需要大家注意的是&…

B/S 结构系统的 缓存机制(Cookie) 以及基于 cookie 机制实现 oa 十天免登录的功能

B/S 结构系统的 缓存机制(Cookie) 以及基于 cookie 机制实现 oa 十天免登录的功能 文章目录 B/S 结构系统的 缓存机制(Cookie) 以及基于 cookie 机制实现 oa 十天免登录的功能每博一文案1. Cookie 的概述2. session 与 Cookie 之间的联系&#xff1a;3. Cookie 的作用&#xff…

盈泰德带你了解产品表面缺陷检测系统

与前几年相比&#xff0c;机器视觉行业在表面检测方面有了很大的突破。检测产品表面的划痕、污渍不再困难&#xff0c;广泛应用于金属、玻璃、手机屏幕、液晶面板等行业的表面检测。 机器视觉检测有以下四种常用的检查和照明方法&#xff1a; 同轴照明、低角度照明、背光照明…

Python一行命令搭建HTTP服务器并外网访问 - 内网穿透

文章目录 1.前言2.本地http服务器搭建2.1.Python的安装和设置2.2.Python服务器设置和测试 3.cpolar的安装和注册3.1 Cpolar云端设置3.2 Cpolar本地设置 4.公网访问测试5.结语 转载自远程内网穿透的文章&#xff1a;【Python】快速简单搭建HTTP服务器并公网访问「cpolar内网穿透…

Java 基础进阶篇(五)—— 抽象类与模板方法设计模式

文章目录 一、抽象类、抽象方法概述二、抽象类的特征三、模板方法设计模式3.1使用场景3.2 实现步骤3.3 写作文案例 补充&#xff1a;final 和 abstract 是什么关系? 一、抽象类、抽象方法概述 在 Java 中 abstract 是抽象的意思&#xff0c;可以修饰类、成员方法。 abstract …

win10远程桌面控制Ubuntu服务器 - 内网穿透实现公网远程

文章目录 前言视频教程1. ubuntu安装XRDP2.局域网测试连接3. Ubuntu安装cpolar内网穿透4.cpolar公网地址测试访问5.固定域名公网地址 转载自远程穿透文章&#xff1a;Windows通过RDP异地远程桌面Ubuntu【内网穿透】 前言 XRDP是一种开源工具&#xff0c;它允许用户通过Windows…