vector以及list

news2024/11/17 22:20:15

之前已经学习过了string类,接下来介绍c++中的另外两个类—— vector和list;

vector

之前介绍的string类是c++所特定的字符数组;

而vector可以看做是string类的扩展,因为它是一个模板类;

它可以作为任何类型的数组,比如 int ,char,string等等类型;

 但是和c语言中的数组不同的是,它是可变的;

vector的特性

1.是可变大小的序列容器

2.vector是采用连续存储空间来存储元素,可以随机访问,但是大小被容器自动处理

3.vector尾插尾删效率高,但是其他位置的删除和插入就不行了

 

vector的使用方式

vector<类型名> <变量名>

#include<iostream>
#include<vector>

using namespace std;

int main()
{
	vector<int> v1;
	v1.push_back(1);
	v1.push_back(2);
	v1.push_back(3);
	v1.push_back(4);
	
	int n = v1.size();

	for (int i = 0; i < n; i++)
	{
		cout << v1[i];
	}

	cout << endl;

	return 0;
}

 

 通过string的学习,实际上就已经了解了vector的大部分函数了;

vector唯一和string不一样的就是string可以直接输出,而vector只能一个一个输出;

此外它们的函数基本一样;

vector的迭代器失效(string通用)

每个容器都有迭代器,而迭代器是一个类似于指针的东西,因此迭代器在一些场景会出现失效的情况;

情况1:引起底层空间改变的操作 

vector和string这种连续存储的容器的扩容并不是在原来的空间上扩容

 而是新开辟一个更大的空间,然后将数据放到原来的空间,然后释放原空间;

但是我们的迭代器若是未及时更新,就会导致迭代器指向无效空间;

而当我们使用 resize,resere,insert,assign,push_back 等函数的时候;

就可能会导致底层空间需要扩容;

这样我们的迭代器就会失效;

#include<iostream>
#include<vector>
#include<string>
using namespace std;

int main()
{
	vector<int> v1;
	v1.push_back(1);
	v1.push_back(2);
	v1.push_back(3);
	v1.push_back(4);
	vector<int>::iterator iv1 = v1.begin() + 2;
	
	v1.reserve(30);
	cout << *iv1 << endl;

	cout << endl;


	return 0;
}

我们可以看到,iv1 迭代器指向的地址已经失效了,无法输出;

因此我们使用迭代器的时候,一定要注意迭代器是否失效;

这种情况string也会出现,因此我们在使用容器的迭代器的时候,一定要注意时刻更新迭代器;

而我们都知道当 vector 的容器存满了内容后会自动扩容;

而它的扩容又是开辟新空间;

因此当我们的迭代器出现问题的时候,可能就是我们的容器扩容了,而迭代器位置为更新的原因

 

情况2:指定位置删除操作——erase

void test2()
{
	vector<int> v1;
	v1.push_back(1);
	v1.push_back(2);
	v1.push_back(3);
	v1.push_back(4);
	vector<int>::iterator iv1 = v1.end();
	v1.erase(iv1);
	cout << *iv1 << endl;

}

这里是因为我们的迭代器指向了容器的尾端;

而若是我们删除了迭代器所在位置,那么迭代器就会指向了end的位置,从而导致迭代器失效了;

 

迭代器失效的解决方式:对迭代器重新赋值

 

list

list 和 vector 以及 string 不一样,它并不是在一片连续的空间的,而是随取随用;

这意味着 list 无法随机访问;

而 list 底层是一个双向循环链表,这使得 list 的头插头删尾插尾删都十分方便快捷;

并且,list 也是一个模板类,可以指定不同类型的 list 变量;

list的使用

void test3()
{
	list<int> l1;
	l1.push_back(1);
	l1.push_back(1);
	l1.push_back(1);
	list<int>::iterator il1 = l1.begin();
	while (il1 != l1.end())
	{
		cout << *il1 << ' ';
		il1++;
	}
	cout << endl;
}

 

list的各种成员函数

之前提到过,list的无法随机访问,也就是说list无法通过下标来访问成员;

但是除此之外,list 的成员函数的使用方式和之前的vector,list 都是一样的;

 

 

 

 

不管是构造函数,还是头插尾插啥的,使用方式都是一样的;

list的迭代器失效

list 的迭代器失效只在 list 删除时会出现;

之前说过,list 是一个双向循环链表;

而链表的每一个节点都是独立的,只是通过指针来链接罢了;

那么这也就说明,list 的 erase 的底层实现和别的容器不同;

list 的 erase  是释放该位置的节点然后返回下一个节点的位置

而之前的 vector 和 string 都是在连续的一片空间存储

erase都是将该位置的数据用后面的数据覆盖

因此只要 erase 的位置不是最后一个,或者说没有扩容,就不会导致迭代器失效;

这也就说明, list 的 erase 会随时随地导致迭代器失效;

void test3()
{
	list<int> l1;
	l1.push_back(1);
	l1.push_back(1);
	l1.push_back(1);
	list<int>::iterator il1 = l1.begin();
	while (il1 != l1.end())
	{
		l1.erase(il1);
		il1++;
	}
	cout << endl;
}

比如这里,我们将 il1 的位置删除了,那么就直接导致迭代器失效了;

 而我们若是想清空 list 的元素,应该这样做:

void test3()
{
	list<int> l1;
	l1.push_back(1);
	l1.push_back(1);
	l1.push_back(1);
	list<int>::iterator il1 = l1.begin();
	while (il1 != l1.end())
	{
		il1 = l1.erase(il1);
		
	}
	cout << endl;
}

 

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

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

相关文章

小侃设计模式(廿二)-访问者模式

1.概述 访问者模式&#xff08;Visitor Pattern&#xff09;指的是在类的内部结构不变的情况下&#xff0c;不同的访问者访问这个对象都会呈现出不同的处理方式。它的主要作用时将数据结构与数据操作分离&#xff0c;将不同的算法与其所作用的对象进行分离。本文将详述访问者模…

DW动手学数据分析Task2:数据清洗及特征处理

文章目录一 数据清洗1 缺失值观察与处理1.1 缺失值观察1.2 缺失值处理2 重复值观察与处理二 特征处理1 分箱&#xff08;离散化&#xff09;处理2 对文本变量进行转换3 从纯文本Name特征里提取出Titles的特征3 参考文章一 数据清洗 数据清洗&#xff1a;我们拿到的数据通常是不…

树的知识概括锦囊(一)

作者&#xff1a;爱塔居 专栏&#xff1a;数据结构 作者简介&#xff1a;大三学生&#xff0c;希望跟大家一起进步&#xff01; 文章目录 目录 文章目录 一、树形结构 二、树的基础知识 三、二叉树 3.1 概念 3.2 特殊的二叉树 ​编辑 3.3 二叉树的性质 四、习题挑战 一、树形结…

手把手教你学51单片机-如何学习单片机

大多数大学生之所以最后变的平庸,不是因为脑子多么笨,也不是全怪自己贪玩不上进,只是没有一个好的领路人,许多学校可能挂着导师的名头,但是多数是挂羊头卖狗肉或者是干脆不管。最后等大学生毕业之后,那些所谓的老师就会说学生很差或者学习很差,反正就是跟自己没啥关系。…

OSPF综合实验(华为)

题目&#xff1a; 思路&#xff1a; 首先配置每个区域的路由和环回地址&#xff0c;其次&#xff0c;根据题目要求打通每个网络的连接&#xff0c;区域0用MGRE打通网络&#xff0c;区域4需要重发布&#xff0c;其次再考虑优化的问题。ip地址的规划是为了更好的路由汇总&#x…

《 Unity Shader 入门精要》第5章 开始 Unity Shader 学习之旅

第5章 开始 Unity Shader 学习之旅 5.2 一个最简单的顶点/片元着色器 顶点/片元着色器的基本结构 // Upgrade NOTE: replaced mul(UNITY_MATRIX_MVP,*) with UnityObjectToClipPos(*)// 定义 shader 的名字 Shader "Chapter 5/Simple Shader" {SubShader{Pass {//…

自动驾驶控制算法之车辆横向控制(project)

本文为深蓝学院-自动驾驶控制与规划-第三章作业 目录 1 projection introduction 2 思路提示 2.1 ComputeControlCmd 2.2 ComputeLateralErrors 3 Corer Case 3.1 Low speed operation 3.2 Extra damping on heading 3.3 Steer into constant radius curve 4 ROSLGSV…

FFmpeg-4.2.4的filter: drawbox源码分析

1. vf_drawbox.c功能 有两个功能 ,添加方框,和添加网格; 1.1 添加方框效果 1.2 添加网格效果

c++数据结构-树(详细总结附代码,一看就懂)

树的定义一棵树是由n&#xff08;n>0&#xff09;个元素组成的有限集合&#xff0c;其中&#xff1a;&#xff08;1&#xff09;每个元素称为结点&#xff08;node&#xff09;&#xff08;2&#xff09;有一个特定的结点&#xff0c;称为根结点或树根&#xff08;root&…

上海亚商投顾:双创指数低开高走,数字经济继续活跃

上海亚商投顾前言&#xff1a;无惧大盘涨跌&#xff0c;解密龙虎榜资金&#xff0c;跟踪一线游资和机构资金动向&#xff0c;识别短期热点和强势个股。市场情绪三大指数今日低开高走&#xff0c;创业板指午后涨超1%&#xff0c;科创50指数涨超1.6%。数字经济概念继续爆发&#…

算法基础(一):时间复杂度和空间复杂度

算法基础&#xff08;一&#xff09;&#xff1a;时间复杂度和空间复杂度时间复杂度 O(1)O(1)O(1) O(N)O(N)O(N) O(logN)O(log N)O(logN) O(MN)O(MN)O(MN) O(NlogN)O(Nlog N)O(NlogN)、O(MlogN)O(Mlog N)O(MlogN) O(N2)O(N^2)O(N2)空间复杂度一些算法基础知识点和leetcode题解&…

【网络通信】【电信运营商实战工程师】思科设备篇-思科设备企业网实战

电信运营商实战工程师系列文章. 思科设备篇-思科设备企业网实战. 文章目录1. 思科设备基本开局配置2. ARP协议、交换机工作原理及广播风暴问题3. 思科设备 VLAN 及单臂路由实战4. 思科三层交换机实现 VLAN 间路由实战5. 思科设备静态默认及浮动路由实战6. 思科设备NAT实战全集1…

YOLO_V8训练自己的数据集

YOLO_V8在2023年开年横空出世&#xff0c;在春节前还得卷一下。由于YOLO_V8和YOLO_V5是同一个作者&#xff0c;所以很多操作都是一样的&#xff0c;下面主要描述一下如何用自己的数据集进行训练和测试&#xff08;非命令行的方式&#xff09;。1、训练数据和模型的目录结构这里…

设计模式学习(九):Abstract Factory抽象工厂模式

目录 一、什么是Abstract Factory模式 二、Abstract Factory示例代码 2.1 类之间的关系 2.2 抽象的零件:ltem类 2.3 抽象的零件:Link类 2.4 抽象的零件:Tray类 2.5 抽象的产品: Page类 2.6 抽象的工厂:Factory类 2.7 使用工厂将零件组装称为产品:Main类 2.8 具体的工厂…

linux三剑客之AWK

目录 AWK是什么 AWK基本结构 a.txt的文本实例 AWK内置变量 a.txt的文本实例 AWK自定义变量 a.txt的文本实例 AWK内置函数 a.txt的文本实例 awk高级输出 a.txt的文本实例 排序输出 a.txt的文本实例 条件选择输出 a.txt的文本实例 控制语句 a.txt的文本实例 AWK是什…

Java SE 继承和多态

继承和多态 1. 继承 1.1 为什么需要继承 Java中使用类对现实世界中实体来进行描述&#xff0c;类经过实例化之后的产物对象&#xff0c;则可以用来表示现实中的实体&#xff0c;但是 现实世界错综复杂&#xff0c;事物之间可能会存在一些关联&#xff0c;那在设计程序是就需…

Elasticsearch7.8.0版本高级查询—— 指定查询字段查询文档

目录一、初始化文档数据二、指定查询字段查询文档2.1、概述2.2、示例一、初始化文档数据 在 Postman 中&#xff0c;向 ES 服务器发 POST 请求 &#xff1a;http://localhost:9200/user/_doc/1&#xff0c;请求体内容为&#xff1a; {"name":"张三","…

Git知识学习

主要内容&#xff1a;熟练掌握Git、GitHub、GitLab、Gitee码云的使用 文章目录1.Git概述1.1版本控制1.2版本控制工具1.3Git和代码托管中心2.Git常用命令2.1设置用户签名2.2初始化本地库2.3查看本地库状态2.3.1首次查看2.3.2新增文件2.3.3再次查看2.4添加暂存区2.4.1将工作区文件…

! LaTeX Error: File xxx.sty not found-统一解决办法

在使用一些模板时常见这个错&#xff0c;其实就是缺宏包&#xff01;解决方案如下&#xff01; 第一步&#xff1a;在网站 https://ctan.org/pkg 找到你缺失的宏包&#xff0c;下载zip文件。 第二步&#xff1a;将解压后的文件夹复制到安装路径下&#xff1a; 如&#xff…

aws ecs 理解任务和容器的资源分配

参考资料 如何在 Amazon ECS 中为任务分配内存&#xff1f; 关于 Amazon ECS 中的 CPU 分配&#xff0c;我需要了解哪些信息&#xff1f; Amazon ECS CloudWatch 指标 任务定义参数 在ecs中可以指定资源的分配逻辑&#xff0c;其实就是cpu和内存分配。 下面这张图对ecs任…