我与C++的爱恋:list的使用

news2024/7/7 18:13:29


外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

🔥个人主页guoguoqiang. 🔥专栏我与C++的爱恋

Alt

一、list介绍

在这里插入图片描述
1.list是可以在常数范围内在任意位置进行插入和删除的序列式容器,并且该容器可以前后双向迭代
2.list的底层是双向链表结构,双向链表中每个元素存储在互不相关的独立节点中,在节点中通过指针指向其前一个元素和后一个元素
3.list与forward_list非常相似:最主要的不同在于forward_list是单链表,只能朝前迭代,已让其更简单高效
4.与其他的序列式容器相比(array,vector,deque),list通常在任意位置进行插入、移除元素的执行效率更好
5.与其他序列式容器相比,list和forward_list最大的缺陷是不支持任意位置的随机访问,比如:要访问list的第6个元素,必须从已知的位置 (比如头部或者尾部)迭代到该位置,在这段位置上迭代需要线性的时间开销;list还需要一些额外的空间,以保存每个节点的相关联信息 (对于存储类型较小元素的大list来说这可能是一个重要的因素)

list可以双向迭代,本质就是双向循环链表

二、接口函数

构造函数

在这里插入图片描述
1.默认构造函数创建一个没有任何元素的空链表。
2.填充构造函数允许创建一个包含特定数量相同值的元素的链表。
3.范围构造函数可以从任何提供迭代器接口的其他容器复制元素。
4.拷贝构造函数创建了一个当前list的副本。

填充构造函数前面的explicit关键字表明这个构造函数不能用于隐式转换或复制初始化,它需要直接调用来构造对象。其他构造函数则根据是否带有explicit关键字来决定是否能用于隐式转换或复制初始化

迭代器

在这里插入图片描述
迭代器用来遍历链表。

int main() {
	list<int> it = { 1,2,3,4,5,6,10 };
	list<int>::iterator i1 = it.begin();
	while (i1 != it.end()) {
		cout << *i1 << " ";
		i1++;
	}
	cout << endl;
	for (auto e : it) {
		cout << e << " ";
	}
	cout << endl;
	return 0;
}


容量操作

在这里插入图片描述
empty检测list是否为空,是返回true,否则返回false
size返回有效元素个数的值

元素访问

在这里插入图片描述
front返回list的第一个节点值的引用
back返回list的最后一个节点值的引用

内容操作

在这里插入图片描述
insert在这里不会出现迭代器失效

迭代器失效即迭代器所指向的节点的无效,即该节点被删除了。因为list的底层结构为带头结点的双向循环链表,因此在list中进行插入时是不会导致list的迭代器失效的,只有在删除时才会失效,并且失效的只是指向被删除节点的迭代器,其他迭代器不会受到影响

void TestListIterator1()
{
	int array[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 };
	list<int> l(array, array + sizeof(array) / sizeof(array[0]));
	auto it = l.begin();
	while (it != l.end())
	{
		l.erase(it);
		++it;
	}
}

erase()函数执行后,it所指向的节点已被删除,因此it无效,在下一次使用it时,必须先给其赋值

void TestListIterator()
{
	int array[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 };
	list<int> l(array, array + sizeof(array) / sizeof(array[0]));
	auto it = l.begin();
	while (it != l.end())
	{
		it = l.erase(it);//这行代码就在删除后更新了it
	}
}

在list中erase失效只影响被删除的元素,但是对于其他的容器(vector、deque)可能就不能这样了,因为这些容器的erase操作可能会影响被删除的元素之后的元素的迭代器全部失效。

operations

在这里插入图片描述
list 提供了一些有用的成员函数,允许执行各种操作,如元素的合并、移除、排序和倒序。
1.splice: 将元素从一个列表转移到另一个列表,可以转移整个列表、一个单独的元素或一个元素范围。

int main() {
	list<int> list1 = { 1, 2, 3 };
	list<int> list2 = { 4, 5, 6 };
	list1.splice(list1.end(), list2);
	list<int>::iterator i1 = list1.begin();
	while (i1 != list1.end()) {
		cout << *i1 << " ";
		i1++;
	}
	cout << endl;//1 2 3 4 5 6
	return 0;
}

2.remove: 从列表中移除所有具有特定值的元素。

int main() {
	list<int> list1 = { 1, 2, 3,3,3,5,6 };
	list1.remove(3);
	list<int>::iterator i1 = list1.begin();
	while (i1 != list1.end()) {
		cout << *i1 << " ";
		i1++;
	}
	cout << endl;//1 2 5 6
	return 0;
}

3.remove_if: 根据一个判断条件移除元素。

int main() {
	list<int> list1 = { 1, 2, 3,3,3,5,6 };
	list1.remove_if([](int n) { return n % 2 == 0; });
	list<int>::iterator i1 = list1.begin();
	while (i1 != list1.end()) {
		cout << *i1 << " ";
		i1++;
	}
	cout << endl;
	return 0;
}

在这里插入图片描述

4.unique: 移除连续并且重复的元素,只保留唯一的元素。
在这里插入图片描述

int main() {
	list<int> list1 = { 1, 2, 3,3,3,5,5,6,6,8,9 };
	list1.unique();
	list<int>::iterator i1 = list1.begin();
	while (i1 != list1.end()) {
		cout << *i1 << " ";
		i1++;
	}
	cout << endl;
	return 0;
}

5.merge: 合并两个已排序的列表,并确保结果列表也是排序的。
在这里插入图片描述

int main() {
	std::list<int> list1 = { 1, 3, 5 };
	std::list<int> list2 = { 2, 4, 6 };
	list1.merge(list2);
	list<int>::iterator i1 = list1.begin();
	while (i1 != list1.end()) {
		cout << *i1 << " ";
		i1++;
	}
	cout << endl;
	return 0;
}

6.sort: 对列表中的元素进行排序。它接受一个比较函数作为参数(可选)。
在这里插入图片描述

int main() {
	std::list<int> list1 = { 4, 3, 5, 2, 1 };
	list1.sort();
	list<int>::iterator i1 = list1.begin();
	while (i1 != list1.end()) {
		cout << *i1 << " ";
		i1++;
	}
	cout << endl;
	return 0;
}

7.reverse: 反转列表中元素的顺序。

int main() {
	std::list<int> list1 = { 5,4, 3,  2, 1 };
	list1.reverse();
	list<int>::iterator i1 = list1.begin();
	while (i1 != list1.end()) {
		cout << *i1 << " ";
		i1++;
	}
	cout << endl;
	return 0;
}

在这里插入图片描述

本篇内容到此结束,感谢大家的观看!!!

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

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

相关文章

python: create Envircomnet in Visual Studio Code 创建虚拟机

先配置python开发环境 1.在搜索栏输入“>" 或是用快捷组合键ctrlshiftP键 就会显示”>",再输入"python:" 选择已经安装好的python的版本,选定至当前项目中&#xff0c;都是按回车 就可以看到创建了一个虚拟机的默认的文件夹名".venv" 2 te…

KUKA仿真教学8:设备保养屏蔽

目录 一、屏蔽步骤 一、屏蔽步骤

ghost恢复?电脑文件恢复如何操作?电脑数据恢复工具!5款!

在数字化时代&#xff0c;电脑数据的价值日益凸显。然而&#xff0c;数据丢失、误删、系统崩溃等问题时有发生&#xff0c;给个人和企业带来巨大损失。本文将为您详细介绍Ghost恢复方法&#xff0c;同时推荐五款高效的电脑数据恢复工具&#xff0c;助您轻松应对数据丢失的困扰。…

Node.js学习(一)

Node.js安装与入门案例&#xff1a; 需求&#xff1a;点击按钮&#xff0c;请求本地目录指定文件的内容&#xff0c;并显示在页面上 刚入门肯定想着直接写相对路径请求指定路径数据就行了&#xff0c;可是会发现不行。 网页运行在浏览器端&#xff0c;通常后续要发布&#xf…

全面了解机器学习

目录 一、基本认识 1. 介绍 2. 机器学习位置 二、机器学习的类型 1. 监督学习 2. 无监督学习 3. 强化学习 三、机器学习术语 1. 训练样本 2. 训练 3. 特征 4. 目标 5. 损失函数 四、机器学习流程 五、机器学习算法 1. 分类算法 2. 聚类算法 3. 关联分析 4. …

高通骁龙(Qualcomm Snapdragon)CDSP HVX HTP 芯片简介与开发入门

1. Hexagon DSP/HVX/HTP 硬件演进 说到高通骁龙芯片大家应该不会陌生&#xff0c;其作为最为广泛的移动处理器之一&#xff0c;几乎每一个品牌的智能手机都会使用高通骁龙的处理器。 高通提供了一系列骁龙芯片解决方案。根据性能强弱分为了5个产品系列&#xff1a;从最高端的…

verilog实现PID控制

1 原理讲解 距离上一次说PID算法的事情过去蛮久了&#xff0c;今天又重新看了看PID的代码&#xff0c;其实还是存在一些不合理的地方。 整理归纳了一下原理&#xff0c;位置式和增量式的变化。 2 工程实现 timescale 1ns / 1psmodule pid_controller(input clk,input r…

MySQL——事务ACID原则、脏读、不可重复读、幻读

什么是事务 要么都成功&#xff0c;要么都失败 一一一一一一一 1. SQL执行&#xff1a;A给B转账 A 1000 ---->200 B 200 2. SQL执行&#xff1a;B收到A的钱 A 800 B 400 一一一一一一一 将一组SQL放在一个批次中去执行~ 事务原则&#xff1a;ACI…

从零搭建Prometheus到Grafana告警推送

目录 一、Prometheus源码安装和动态更新配置 二、Prometheus操作面板和常见配置 三、Prometheus常用监控组件exporter配置 3.1 exporter是什么 3.2 有哪些exporter 3.3 exporter怎么用 3.4 实战 node_exporter ​3.5 其它exporter都怎么用 四、Promethus整合新版Sprin…

线程状态转换总结

1. NEW -> RUNNABLE 创建线程后是 NEW 状态&#xff08;只是 Java 层面新建的&#xff0c;还没有关联到操作系统实际的线程上&#xff09;&#xff0c;调用线程的 start() 方法会将 Java 线程和操作系统的线程关联起来&#xff0c;进入 RUNNABLE 状态 2. RUNNABLE <->…

入门PHP就来我这(纯干货)05

~~~~ 有胆量你就来跟着路老师卷起来&#xff01; -- 纯干货&#xff0c;技术知识分享 ~~~~ 路老师给大家分享PHP语言的知识了&#xff0c;旨在想让大家入门PHP&#xff0c;并深入了解PHP语言。 1 数组及创建 数组&#xff0c;顾名思义&#xff0c;本质上就是一系列数据的组合…

【Linux进程通信】使用匿名管道制作一个简单的进程池

进程池是什么呢&#xff1f;我们可以类比内存池的概念来理解进程池。 内存池 内存池是在真正使用内存之前&#xff0c;先申请分配一定数量的、大小相等(一般情况下)的内存块留作备用。当有新的内存需求时&#xff0c;就从内存池中分出一部分内存块&#xff0c;若内存块不够再继…

docker-compose搭建prometheus、grafana

一、安装prometheus 1、安装 version: 3.1services:prometheus:image: prom/prometheus:v2.48.0container_name: prometheushostname: prometheusrestart: alwaysvolumes:- ./prometheus/prometheus.yml:/etc/prometheus/prometheus.yml- ./prometheus/:/etc/prometheus/port…

淘宝扭蛋机小程序开发,新玩法、新收益体验!

近几年&#xff0c;随着娱乐消费的火爆&#xff0c;潮玩市场得到了快速发展&#xff0c;从而带动了扭蛋机市场的发展&#xff0c;扭蛋机也逐渐风靡在消费市场中。对于年轻人消费者来说&#xff0c;愿意为扭蛋机的热门IP商品而买单。目前&#xff0c;价格低、颜值高、种类多样的…

大科技公司大量裁员背后的真相

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

试用笔记之-汇通计算机等级考试软件一级Windows

首先下载汇通计算机等级考试软件一级Windows http://www.htsoft.com.cn/download/htwork.rar

JavaMySQL 学习(基础)

目录 Java CMD Java发展 计算机存储规则 Java学习 switch新用法&#xff08;可以当做if来使用&#xff09; 数组定义 随机数 Java内存分配 MySQL MySQL概述 启动和停止 客户端连接 数据模型 关系型数据库 SQL SQL通用语法 SQL分类 DDL--数据定义语言 数据库…

时间复利效应才是人生的催化剂

在追求成功的道路上&#xff0c;许多人都在寻找捷径。然而&#xff0c;真正的捷径并非不劳而获的幻想&#xff0c;而是通过长期坚持在某一领域深耕细作&#xff0c;享受时间复利效应带来的巨大收益。本文将探讨如何选择合适的领域并长期坚持下去&#xff0c;以实现成功。 时间…

Agent 学习笔记

近年来&#xff0c;人工智能领域取得了重大进展&#xff0c;人工智能代理现在能够处理复杂的任务。尽管取得了这些进展&#xff0c;但有效地并行和协调多个人工智能代理协同工作仍然是一个挑战。 一群智能体可以理解为一组智能体在单个环境中共同共存&#xff0c;该环境可以相…

不用找了!这个软件自带各行业话术,客服效率飞跃

有一款客服工具软件&#xff0c;不但能吸附聊天窗口&#xff0c;实现图文视频话术的一键发送&#xff0c;还内置了多行业的优质客服话术模板&#xff0c;允许用户直接下载使用&#xff0c;快速构建起适合自身企业的专业客服知识库。 前言 在今天的快节奏商业环境中&#xff0c…