【C++】list的使用

news2024/11/20 4:56:02

文章目录

  • 1. list的使用
    • 1. 构造函数
    • 2.迭代器的使用和数据访问
    • 3. 容量相关
    • 4. 数据修改
      • 1.数据插入
      • 2. 数据删除
    • 5.其他接口

1. list的使用

首先,在使用list之前,我们得先了解list到底是个什么东西,查看文档可以了解到,list的底层是一个带头双向循环链表。

image-20230421153930048

按照顺序,我们首先来了解一下list的默认成员函数,这里我们不关注后面关于allocator的参数。

1. 构造函数

image-20230421154853012

接下来通过一段代码来了解一下:

void Test_construct()
{
	list<int> lt1;
	list<int> lt2(5, 2);
	list<int> lt3(lt2.begin(), lt2.end());
	list<int> lt4(lt3);
}

image-20230421155815223

2.迭代器的使用和数据访问

我们知道,迭代器设计模式的出现就是为了让所有的容器都有统一的访问方式,所以这里迭代器的使用与之前讲的string和vector没有任何区别。

void Test_Iterator()
{
	list<int> lt;
	lt.push_back(1);
	lt.push_back(2);
	lt.push_back(3);
	lt.push_back(4);
	lt.push_back(5);
	lt.push_back(6);
	//写
	list<int>::iterator it = lt.begin();
	while (it != lt.end())
	{
		*it *= 10;
		++it;
	}
	//读
	it = lt.begin();
	while (it != lt.end())
	{
		cout << *it << " ";
		++it;
	}
	cout << endl;
}

但是对于string和vector,我们对其中数据访问的方式有三种:[]下标访问,迭代器,范围for。其中使用[]访问的目的是为了访问到任意元素的时间复杂度都为O(1),但是对于list的结构:链表,我们,没办法做到O(1)的访问,所以这里就没有重载[]的必要了所以对于list的访问方式只有迭代器范围for两种。

3. 容量相关

1. size:拿到list的数据个数

由于list的结构,所以不会出现有容量的概念,因为每次插入数据或者删除数据的时候,直接插入或删除一个节点即可。所以这里只提供了size这个接口用于返回数据个数。

image-20230422133446094

2. resize:改变数据个数

image-20230422235713605

和其他STL容器的接口相同的用法

3. clear:清空容器中的所有数据

image-20230422235840390

void Test_Capacity()
{
	list<int> lt;
	lt.push_back(1);
	lt.push_back(2);
	lt.push_back(3);
	lt.push_back(4);
	lt.push_back(5);
	lt.push_back(6);
	cout << "size:" << lt.size() << endl;
	lt.resize(5);
	cout << "size:" << lt.size() << endl;
	lt.resize(10, 20);
	cout << "size:" << lt.size() << endl;
	auto begin = lt.begin();
	while (begin != lt.end())
	{
		cout << *begin << " ";
		++begin;
	}
	cout << endl;
	lt.clear();
	cout << "size:" << lt.size() << endl;
}

image-20230423000207920

4. 数据修改

由于链表结构的特殊性,我们可以很方便的头插,尾插或者在任意位置插入,所以在这里库里面对于数据插入提供了很多种方式

1.数据插入

1. push_back:尾插

image-20230422134237008

2. push_front:头插

image-20230422134217660

3.insert:在任意位置插入删除

image-20230422134302155

void Test_insert()
{
	vector<int> v(5, 888);
	list<int> lt;
	//尾插
	lt.push_back(1);
	lt.push_back(2);
	lt.push_back(3);
	lt.push_back(4);
	lt.push_back(5);
	lt.push_back(6);
	auto it_out = lt.begin();
	while (it_out != lt.end())
	{
		cout << *it_out << " ";
		++it_out;
	}
	cout << endl;
	//头插
	lt.push_front(10);
	it_out = lt.begin();
	while (it_out != lt.end())
	{
		cout << *it_out << " ";
		++it_out;
	}
	cout << endl;
	//在任意位置插入
	auto it_push = ++lt.begin();//从第二个位置开始
	lt.insert(it_push, 30);//插入一个值
	it_out = lt.begin();
	while (it_out != lt.end())
	{
		cout << *it_out << " ";
		++it_out;
	}
	cout << endl;
	++it_push;
	lt.insert(it_push, 5, 50);//插入n个值
	it_out = lt.begin();
	while (it_out != lt.end())
	{
		cout << *it_out << " ";
		++it_out;
	}
	cout << endl;
	++it_push;
	lt.insert(it_push, v.begin(), v.end());//插入一个迭代器区间
	it_out = lt.begin();
	while (it_out != lt.end())
	{
		cout << *it_out << " ";
		++it_out;
	}
	cout << endl;
}

image-20230422135621556

2. 数据删除

与数据插入相对应的,数据删除也有三个

1. pop_back:尾删

image-20230422135837432

2.pop_front:头删

image-20230422135820204

3.erase:任意位置删除

image-20230422135902241

void Test_erase()
{
	list<int> lt;
	for (int i = 0; i < 10; ++i)
	{
		lt.push_back(i);
	}
	auto it_out = lt.begin();
	while (it_out != lt.end())
	{
		cout << *it_out << " ";
		++it_out;
	}
	cout << endl;
	//头删
	lt.pop_front();
	it_out = lt.begin();
	while (it_out != lt.end())
	{
		cout << *it_out << " ";
		++it_out;
	}
	cout << endl;
	//尾删
	lt.pop_back();
	it_out = lt.begin();
	while (it_out != lt.end())
	{
		cout << *it_out << " ";
		++it_out;
	}
	cout << endl;
	//任意位置删除
	auto pos = ++lt.begin();
	pos = lt.erase(pos);//删除某一位置
	it_out = lt.begin();
	while (it_out != lt.end())
	{
		cout << *it_out << " ";
		++it_out;
	}
	cout << endl;
	auto start = ++pos;
	auto end = ++(++start);
	lt.erase(start, end);//删除一个迭代器区间
	it_out = lt.begin();
	while (it_out != lt.end())
	{
		cout << *it_out << " ";
		++it_out;
	}
	cout << endl;
}

image-20230422141427934

5.其他接口

除了上述的接口之外,还有一些我们之前在string和vector中没有见到的接口,下面我们来看看他们的用法

1. remove:删除list中指定值

image-20230423000514372

void Test_remove()
{
	list<int> lt;
	lt.push_back(1);
	lt.push_back(2);
	lt.push_back(3);
	lt.push_back(4);
	lt.push_back(5);
	lt.push_back(6);
	lt.push_back(7);
	lt.push_back(8);
	auto it_out = lt.begin();
	while (it_out != lt.end())
	{
		cout << *it_out << " ";
		++it_out;
	}
	cout << endl;
	lt.remove(5);
	lt.remove(10);
	it_out = lt.begin();
	while (it_out != lt.end())
	{
		cout << *it_out << " ";
		++it_out;
	}
	cout << endl;
}

image-20230423001231333

可以看到,remove对于list中不存在的元素不会做任何操作

2. sort:排序list

image-20230423001550739

看到这里肯定会有人有疑惑,sort算法库里面不是实现过吗?为什么又要重新在list里实现一下,我直接用算法库里面的不行吗?

✅答案是:不行,接下来看实验==》

image-20230423002516367

可以看到,在编译的过程就已经报错了,这是因为库里面没有支持list迭代器类型的构造,为啥嘞?因为之前sort对容器内部的元素操作使用了+和-操作,但是list由于结构的限制,不支持迭代器的这个行为,所以对于list,要重新在库里面实现一个sort。

3. unique:删除list中的重复值

image-20230423003100595

这里注意一下,在使用unique之前要确保list是有序的,否则不能完成删除所有重复值的功能

void Test_Sort()
{
	list<int> lt;
	lt.push_back(1);
	lt.push_back(10);
	lt.push_back(9);
	lt.push_back(3);
	lt.push_back(6);
	lt.push_back(3);
	lt.push_back(7);
	lt.push_back(6);
	cout << "原list:";
	auto it_out = lt.begin();
	while (it_out != lt.end())
	{
		cout << *it_out << " ";
		++it_out;
	}
	cout << endl;
	lt.unique();
	cout << "尝试在乱序的情况下使用unique:";
	it_out = lt.begin();
	while (it_out != lt.end())
	{
		cout << *it_out << " ";
		++it_out;
	}
	cout << endl;
	lt.sort();
	cout << "排序list:";
	it_out = lt.begin();
	while (it_out != lt.end())
	{
		cout << *it_out << " ";
		++it_out;
	}
	cout << endl;
	cout << "对有序的list使用unique:";
	lt.unique();
	it_out = lt.begin();
	while (it_out != lt.end())
	{
		cout << *it_out << " ";
		++it_out;
	}
	cout << endl;
}

image-20230423004016031

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

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

相关文章

使用EasyExcel导出模板并设置级联下拉及其原理分析

一、概述 项目中有时会遇到需要导出一个Excel模板&#xff0c;然后在导出的Excel中填充数据&#xff0c;最终再调用接口批量把Excel中的数据导入到数据库当中的需求。 其中级联下拉选择&#xff0c;手机号校验&#xff0c;性别校验等都是比较常见的校验。 这里就已上面三种情…

县级医院手术麻醉管理系统源码 医院手麻系统源码 C/S架构 系统成熟稳定完整二次开发

医院手麻系统详细功能介绍和说明&#xff1a; ▶手术管理功能包括&#xff1a;手术申请、手术安排、查看手术申请单、手术通知单、填写病人术前会诊记录、谈话记录、麻醉记录、手术记录、附加手术、术后信息及手术回顾等功能。 ▶手术麻醉管理系统包括&#xff1a;手术申请、…

openEuler 欧拉 安装Oracle19c数据库RPM包安装

一、准备工作 将安装部署包上传到服务器上&#xff0c;我安装包放到/home目录下 二、安装依赖包 yum -y install binutils compat-libcap1 compat-libstdc-33 compat-libstdc-33*.i686 elfutils-libelf-devel gcc gcc-c glibc*.i686 glibc glibc-devel glibc-devel*.i686 ksh…

“烧钱”的大模型:初探成本拆解与推理优化方法

编者按&#xff1a;大模型的成本问题一直以来是大家重点关注的问题&#xff0c;本文重点讨论了训练大型语言模型&#xff08;LLMs&#xff09;需要的成本&#xff0c;并简要介绍什么是LLM以及一些用于优化大模型推理表现的技术。 虽然很难准确预测LLMs未来会怎么发展&#xff0…

热血

周五的晚上&#xff0c;决定去看「灌篮高手」电影了。 那还是很多年以前&#xff0c;樱木双手插进裤腰歪头扭嘴吹着口哨&#xff0c;那不羁的样子像极了一只从上往下看的沙雕。 而全国赛的樱木&#xff0c;多少是成熟了很多&#xff0c;是会说一些犯二的话&#xff0c;会和流川…

Spring Boot中上传文件不写临时文件

Spring Boot中上传文件不写临时文件 前言 在SpringBoot文件上传中&#xff0c;用MultipartFile类型接收文件时&#xff0c;SpringBoot会生成一份临时文件&#xff0c;文件格式为upload_*.tmp&#xff0c;如果业务场景有大量小文件需要上传的话&#xff0c;可以将文件直接丢到…

面试官:说说对称加密、非对称加密、混合加密?

对称加密 两边用同一个密钥来加解密。 A把明文通过某一算法加密之后得到密文&#xff0c;然后把密文发送给B&#xff0c;B接收到密文之后用相同的密钥执行相同的算法去解密。X没有密钥&#xff0c;即使窃取到密文也无法窃听。 对称加密的有优缺点 对称加密的优点&#xff1a…

TryHackMe-Misguided Ghosts(boot2root)

Misguided Ghosts 端口扫描 循例nmap FTP枚举 直接登anonymous&#xff0c;有几个文件&#xff0c;下下来 info.txt 我已经包含了您要求的所有网络信息&#xff0c;以及一些我最喜欢的笑话。- 帕拉摩尔该信息可能指的是pcapng文件 jokes.txt Taylor: Knock, knock. Josh: …

【pytest】

pytest 1、环境安装 1、pip install pytest -i https://pypi.tuna.tsinghua.edu.cn/simple --targetC:\Dpan-app\ceshirenenv\Lib\site-packages 2、pycharm安装 2、assert >>> assert True >>> >>> assert False Traceback (most recent call …

一篇文章让你彻底学会--节流(并且自己可以手写)

Hi,有的小伙伴们在面试的时候会被要求手写节流函数&#xff0c;很多都被难着了吧&#xff0c;宝贝&#xff0c;那你你没有理解节流函数。 今天&#xff0c;就让我带你攻克它&#xff01; 1.节流 单位时间内&#xff0c;事件触发&#xff0c;最多只执行一次事件回调。 人话:说…

【STL十三】适配器——迭代器适配器

【STL十二】适配器——迭代器适配器 一、迭代器1、迭代器分类2、迭代器定义3、迭代器和迭代器适配器 二、迭代器适配器、流迭代器1、简介2、迭代器适配器3、流迭代器 三、反向迭代器1、简介2、模板类3、demo 四、插入迭代器1、简介2、模板类3、demo 五、移动迭代器1、简介2、模…

Mysql列的类型定义(日期和时间类型)

文章目录 前言一、类型表二、类型简介总结 前言 日期与时间类型是为了方便在数据库中存储日期和时间而设计的&#xff0c;数据库有多种表示日期和时间的数据类型。其中&#xff0c;YEAR类型表示年&#xff0c;DATE类型表示日期&#xff0c;TIME类型表示时间&#xff0c;DATETIM…

大模型如何赋能?个人AI助理开始靠谱!

想象一下&#xff0c;生活在这样一个世界里&#xff0c;你有一个个人人工智能助手&#xff0c;它不仅能理解你的需求&#xff0c;还能与你一起学习和成长。一个人工智能无缝融入我们日常生活的世界&#xff0c;使我们能够比以往任何时候都更有效地实现我们的目标。那个世界不再…

Linux磁盘分区扩容

磁盘分区主要包含MBR&#xff08;Master Boot Record&#xff09;和GPT&#xff08;GUID Partition Table&#xff09;两种不同方式&#xff1a; MBR&#xff08;主引导记录&#xff09;&#xff0c;驱动器上的一个特殊的启动扇区&#xff0c;最大支持2TB&#xff0c;最多支持4…

【Redis7】Redis7 主从复制(重点:主从复制原理)

【大家好&#xff0c;我是爱干饭的猿&#xff0c;本文重点介绍Redis7 复制。 后续会继续分享Redis7和其他重要知识点总结&#xff0c;如果喜欢这篇文章&#xff0c;点个赞&#x1f44d;&#xff0c;关注一下吧】 上一篇文章&#xff1a;《【Redis7】Redis7 事务&管道&…

navicat 远程连接oracle数据库ORA-12170及ORA-28547问题

目录 1.ORA-12170问题 2.ORA-28547 问题 1.ORA-12170问题 这是防火墙端口连接问题&#xff0c;需要在防火墙中设置oracle数据库端口为例外 解决方案 控制面板—windows防火墙—高级设置—入站规则—新建规则 2.ORA-28547 问题 OCI版本不兼容问题&#xff0c;安装的oracle客…

Python每日一练(20230423)

目录 1. 删除链表的倒数第 N 个结点 &#x1f31f;&#x1f31f; 2. 最小覆盖子串 &#x1f31f;&#x1f31f;&#x1f31f; 3. 二叉树的层序遍历 &#x1f31f;&#x1f31f; &#x1f31f; 每日一练刷题专栏 &#x1f31f; Golang每日一练 专栏 Python每日一练 专栏…

OpenAI最新官方ChatGPT聊天插件接口《插件安全审查流程》全网最详细中英文实用指南和教程,助你零基础快速轻松掌握全新技术(六)(附源码)

Plugin review process 插件审查流程 前言Plugin review process 插件审查流程What we are looking for in a plugin 我们正在寻找一个插件Plugin states 插件状态Types of users 用户类型Submit a plugin for review 提交一个插件进行审核其它资料下载 前言 在 ChatGPT 中&am…

【原创】【理论+题型】二次型化标准型 +合同

&#xff08;A&#xff09;二次型化标准型2方法对比 1任何二次型都能化为标准&#xff0c;有正交变换法和配方法 2任何二次型都能通过配方法变为标准型&#xff0c;但不一定能通过正交变化法变 3二次型的规范型唯一&#xff0c;标准型不唯一 4实对称阵的(合同)对角化问题&#…

产品预览 | 系统仿真与三维专业场仿真融合——MWORKS模型降阶工具箱

1 引言 近二十年来&#xff0c;数字化技术迅猛发展&#xff0c;以美国和中国提出装备数字工程为标志&#xff0c;人类迈入全新的数字化时代。装备数字化需要对装备的运行状态和行为进行准确的模拟和预测&#xff0c;这就需要利用系统仿真技术。系统仿真技术能够综合考虑装备的…