【C++】STL中的list容器详解及常用函数用法

个人主页: 起名字真南的CSDN博客

个人专栏:

  • 【数据结构初阶】 📘 基础数据结构
  • 【C语言】 💻 C语言编程技巧
  • 【C++】 🚀 进阶C++
  • 【OJ题解】 📝 题解精讲

目录

  • 📌 1 引言
  • 📌2 list容器
    • ✨2.1 list容器简介
    • ✨2.2 list容器结构
  • 📌3 list中主要成员函数
    • ✨ 3.1 构造函数初始化list
    • ✨ 3.2 迭代器遍历list容器
    • ✨ 3.3 对list的空间进行操作
    • ✨ 3.4 对list的元素进行访问
    • ✨ 3.5 对list的元素进行修改
      • 🚀3.5.1 push and pop
      • 🚀3.5.2 insert and erase
      • 🚀 3.5.3 swap and clear
  • 4 📌 参考文件

📌 1 引言

在C++的表中模板库(STL)中,list容器提供了一个双向链表的实现,他能高效的在任意位置进行插入和删除元素,非常适合需要频繁修改数据的场景。与vector不同,list是一个双向链表结构,并不支持快速随机访问。本文将详细介绍list容器的特点,使用场景,以及其主要成员函数的用法。

📌2 list容器

✨2.1 list容器简介

在这里插入图片描述

list 容器简介list 是一个双向链表数据结构,具有以下特点:

  • 高效插入和删除:在已知位置插入或删除元素的时间复杂度为 O(1),远高于 vector 的 O(n)。
  • 不支持随机访问:与数组不同,list 不支持通过下标访问,因此需要通过迭代器进行遍历。
  • 双向链表:支持从头部和尾部同时遍历,方便实现一些特定算法。

✨2.2 list容器结构

std::list 使用双向链表实现,每一个节点都包含了两个指针和一个数据字段

  • 数据字段 :用于储存数据
  • 前驱指针 :指向当前节点的前一个节点
  • 后继指针:指向当前接的后一个指针

在这种结构下,list容器还有一个头节点,它的前一个指针对应着尾节点,后一个指针对应着头节点。

  • 头指针 :指向链表中的第一个节点
  • 尾指针 :指向链表的最后一个节点

在这里插入图片描述

📌3 list中主要成员函数

✨ 3.1 构造函数初始化list

构造函数接口说明
list (size_type n, const value_type& val = value_type())构造的list中包含n个值为val的元素
list()构造空的list
list (const list& x)拷贝构造函数
list (InputIterator first, InputIterator last)用[first, last)区间中的元素构造list
#include<iostream>
#include<list>

using namespace std;

int main()
{
	list<int> l1;
	list<int> l2(6, 6);
	list<int> l3(l2);
	int arr[] = { 1,2,3,4,5, };
	list<int> l4(arr, arr + sizeof(arr) / sizeof(arr[0]));

	return 0;
}

调试结果:
在这里插入图片描述

✨ 3.2 迭代器遍历list容器

函数声明接口说明
begin + end返回第一个元素的迭代器 + 返回最后一个元素下一个位置的迭代器
rbegin + rend返回第一个元素的 reverse_iterator,即 end 位置,返回最后一个元素下一个位置的 reverse_iterator,即 begin 位置
list<int>l1(8, 8);
//使用l1的迭代器构造l2
list<int>l2(l1.begin(), l1.end());
//列表格式初始化C++11
list<int>l3{ 1,2,3,4,5,6,7,8,9 };

//使用迭代器的方式来遍历打印数组
int main()
{
	list<int>::iterator it = l1.begin();
	while (it != l1.end())
	{
		cout << *it << " ";
		it++;
	}
	cout << endl;
	
	for (auto au : l3)
	{
		cout << au << " ";
	}
	cout << endl;
	
	auto l = l3.rbegin();
	while (l != l3.rend())
	{
		cout << *l << " ";
		l++;
	}
	cout << endl;
	return 0;
}

输出结果:
在这里插入图片描述
在这里插入图片描述
注意 :

  • 不管是使用正向迭代器还是反向迭代器,我们遍历的方法一直都是++控制。

✨ 3.3 对list的空间进行操作

在这里插入图片描述
在这里插入图片描述

函数声明接口说明
empty检测 list 是否为空,是返回 true,否则返回 false
size返回 list 中有效节点的个数
void test3()
{
	list<int> l1;
	list<int> l2(8,8);

	if (l1.empty())
	{
		cout << "l1 为空" << endl;
	}
	else
	{
		cout << "l1 不为空" << endl;
	}
	if (!(l2.empty()))
	{
		cout << "l2 不为空" << endl;
		cout << "l2.size() : " << l2.size() << endl;
	}

}

输出结果:
在这里插入图片描述
注意 :

  • 在这串代码中empty()的函数返回值是bool,如果为空则返回true,不为空返回false

✨ 3.4 对list的元素进行访问

在这里插入图片描述
在这里插入图片描述

函数声明接口说明
front返回 list 的第一个节点中值的引用
back返回 list 的最后一个节点中值的引用
void test4()
{
	list<int> l1{ 1,2,3,4,5,6,7,8,9,10 };

	cout << "l1.front(): " << l1.front() << endl;
	cout << "l1.back(): " << l1.back() << endl;
}

输出结果:
在这里插入图片描述
注意 :

  • 在list中不能随机访问链表中的元素,只能通过front和back来获取头结点的数据和尾节点的数据

✨ 3.5 对list的元素进行修改

函数声明接口说明
push_frontlist 首元素前插入值为 val 的元素
pop_front删除 list 中第一个元素
push_backlist 尾部插入值为 val 的元素
pop_back删除 list 中最后一个元素
insertlistposition 位置中插入值为 val 的元素
erase删除 listposition 位置的元素
swap交换两个 list 中的元素
clear清空 list 中的有效元素

🚀3.5.1 push and pop

在这里插入图片描述
在这里插入图片描述

在容器的开始位置插入元素
来list容器的开始位置插入一个新的元素,在它当前的第一个元素之前将val的值移到第一个元素中。
增加一个容量。
在容器的末尾位置插入元素
来list容器的开始位置插入一个新的元素,在它当前的第一个元素之前将val的值移到第一个元素中。
增加一个容量。

void test5()
{
	list<int> l1{ 1,2,3,4,5,6,7,8,9 };
	l1.push_front(0);
	l1.push_back(10);
	for (auto it : l1)
	{
		cout << it << " ";
	}
	cout << endl;
}

输出结果:
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

将list中第一个元素删除,减少一个容量。
将list中末尾元素删除,减少一个容量。

void test5()
{
	list<int> l1{ 1,2,3,4,5,6,7,8,9 };
	l1.push_front(0);
	l1.push_back(10);
	for (auto it : l1)
	{
		cout << it << " ";
	}
	cout << endl;

	l1.pop_back();
	l1.pop_front();

	for (auto it : l1)
	{
		cout << it << " ";
	}
	cout << endl;
}

输出结果:
在这里插入图片描述

🚀3.5.2 insert and erase

在这里插入图片描述

insert 在pos位置的数据前面插入一个数据
从图中我们可以看到传的参数可以是迭代器位置,也可以是一个迭代器区间

void test6()
{
	
	list<int> l1{0,1,2,3,5,6,7,8,9 };
	for (auto it : l1)
	{
		cout << it << " ";
	}
	cout << endl;

	l1.insert(l1.begin(), 18);
	for (auto it : l1)
	{
		cout << it << " ";
	}
	cout << endl;

}

输出结果:
在这里插入图片描述

在这里插入图片描述

erase 将pos位置的数据删除
从图中可以看到参数可以是一个迭代器区间也可以是一个位置

void test6()
{
	
	list<int> l1{0,1,2,3,5,6,7,8,9 };
	for (auto it : l1)
	{
		cout << it << " ";
	}
	cout << endl;

	l1.erase(--l1.end());
	for (auto it : l1)
	{
		cout << it << " ";
	}
	cout << endl;

}

输出结果:
在这里插入图片描述
注意 :

  • 在我们erase的时候需要注意关于迭代器失效的问题,在我们调用erase是必须保证他指向了一个有效的位置,如果代码中使用l1.erase(l1.end())在我们删除最后一个元素的时候他指向了最后一个数据的尾巴所以会造成迭代器失效

🚀 3.5.3 swap and clear

在这里插入图片描述

交换两个相同类型容器的元素

	for (auto it : l1)
	{
		cout << it << " ";
	}
	cout << endl;

	list<int> l2(6, 6);
	for (auto it : l2)
	{
		cout << it << " ";
	}
	cout << endl;
	swap(l1, l2);
	for (auto it : l1)
	{
		cout << it << " ";
	}
	cout << endl;

	for (auto it : l2)
	{
		cout << it << " ";
	}

输出结果:
在这里插入图片描述

在这里插入图片描述

清空list中所有有效元素

	l1.clear();
	l2.clear();

调试结果:
在这里插入图片描述

4 📌 参考文件

传送门: C++Reference


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

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

相关文章

使用kalibr_calibration标定相机(realsense)和imu(h7min)

vslam-evaluation/VINS/Installation documentation/4.IMU和相机联合标定kalibr_calibration.md at master DroidAITech/vslam-evaluation GitHub 目录 1.kalibr安装 1.1安装依赖项 1.2创建工作空间 1.3下载kalibr并编译 1.4设置环境变量 2.准备标定板 3.配置驱动和打…

论文阅读:基于语义分割的非结构化田间道路场景识别

论文地址&#xff1a;DOI: 10.11975/j.issn.1002-6819.2021.22.017 概要 环境信息感知是智能农业装备系统自主导航作业的关键技术之一。农业田间道路复杂多变&#xff0c;快速准确地识别可通行区域&#xff0c;辨析障碍物类别&#xff0c;可为农业装备系统高效安全地进行路径规…

能识别黑烟的摄像头

能识别黑烟的摄像头主要应用于监测车辆尾气排放情况&#xff0c;特别是针对排放黑烟的车辆进行抓拍和识别。以下是朗观视觉对这类摄像头的详细介绍&#xff1a; 一、主要特点 智能识别&#xff1a;摄像头内置视频识别功能&#xff0c;能够实时分析视频中的车辆尾气排放情况&am…

Docker镜像分成

1. 镜像分层原理 1.1 镜像分层的定义与结构 Docker 镜像的分层存储机制是其核心特性之一&#xff0c;它允许 Docker 镜像由多个只读层组成&#xff0c;这些层叠加在一起形成一个完整的文件系统。每个层代表 Dockerfile 中的一个指令&#xff0c;并且每一层都是不可变的&#…

2020年美国总统大选数据分析与模型预测

数据集取自&#xff1a;2020年&#x1f1fa;&#x1f1f8;&#x1f1fa;&#x1f1f8;美国大选数据集 - Heywhale.com 前言 对2020年美国总统大选数据的深入分析&#xff0c;提供各州和县层面的投票情况及选民行为的可视化展示。数据预处理阶段将涉及对异常值的处理&#xff0…

微服务系列五:避免雪崩问题的限流、隔离、熔断措施

目录 实验环境说明 前言 一、一片小雪花引起的雪崩&#xff01; 1.1 雪崩问题&#xff08;级联失败问题&#xff09;示意图 1.2 雪崩问题的产生原因与解决策略 二、雪崩问题的具体解决策略 2.1 请求限流 2.2 线程隔离 2.3 服务熔断 2.4 总结——具体解决策略 三、微…

聊一聊:ChatGPT搜索引擎会取代谷歌和百度吗?

当地时间 10 月 31 日&#xff0c;OpenAI 正式推出了 ChatGPT 搜索功能&#xff0c;能实时、快速获取附带相关网页来源链接的答案。这一重大升级标志着其正式向谷歌的搜索引擎霸主地位发起挑战。 本周五我们聊一聊&#xff1a; 欢迎在评论区畅所欲言&#xff0c;分享你的观点~ …

国标GB28181公网直播EasyGBS国标GB28181软件管理解决方案

随着信息技术的飞速发展&#xff0c;视频监控技术已经成为维护公共安全、提升管理效率的重要手段。在这一背景下&#xff0c;国标GB28181软件EasyGBS作为一款自主研发的安防视频管理软件&#xff0c;致力于为用户提供全面、高效且可靠的视频监控管理体验。其强大的功能和灵活的…

《Practical Deep Raw Image Denoising on Mobile Devices》论文详解

简介&#xff1a;个人学习分享&#xff0c;如有错误&#xff0c;欢迎批评指正。 论文&#xff1a;Practical Deep Raw Image Denoising on Mobile Devices 引言 在数字摄影领域&#xff0c;噪声是影响图像质量的主要因素之一&#xff0c;特别是在弱光条件下拍摄时更为明显。移…

戴尔电脑 Bios 如何进入?Dell Bios 进入 Bios 快捷键是什么?

BIOS&#xff08;基本输入输出系统&#xff09;是计算机启动时运行的第一个程序&#xff0c;它负责初始化硬件并加载操作系统。对于戴尔电脑用户来说&#xff0c;有时可能需要进入 BIOS 进行一些特定的设置调整&#xff0c;比如更改启动顺序、调整性能选项或解决硬件兼容性问题…

【AD】3-2 原理图绘制格点的调整与推荐设置

1.点击工具&#xff0c;选择原理图优先项&#xff0c;如图设置 2.画原理图之前&#xff0c;选中原理图&#xff0c;也可以快捷键vgs&#xff0c;设置栅格为100mil&#xff0c;并画原理图是元器件管脚放置在格点上 3.通过改选项设置格点显示与不显示

I.MX6U 裸机开发2. 芯片简介、汇编基础及GPIO操作准备工作

I.MX6U 裸机开发2. 芯片简介、汇编基础及GPIO操作准备工作 一、I.MX6U 芯片介绍1. 基本介绍2. 架构图如下&#xff1a;3. I.MX6U 管脚定义规则 &#xff1a; 二、GPIO资源介绍1. 原理图2. 寄存器控制(1) 使能时钟&#xff0c;CCGR0~CCGR7(2) 设置引脚复用(3) 设置电气属性(4) 配…

DNS配置

1.搭建dns服务器能够对自定义的正向或者反向域完成数据解析查询。 2.配置从DNS服务器&#xff0c;对主dns服务器进行数据备份。 options {listen-on port 53 { 192.168.111.130; };directory "/var/named";allow-query { any;};zone "openlab.com&qu…

day-81 打家劫舍 II

思路 与LCR 089. 打家劫舍相比&#xff0c;本题所有房屋围成了一圈&#xff0c;那么第一间房子和最后一间房子不能同时打劫&#xff0c;那么就可以分为两种情况&#xff1a;1.选第一间房打劫&#xff1b;2.选最后一间房打劫 解题过程 然后依次计算出以上两种情况的最大金额&am…

什么是进销存?进销存系统都有哪些类型?

进销存管理和企业运营之间的利害关系大家应该都已经听的不少了。上次给大家说明白了进销存系统是什么&#xff0c;但是进销存系统到底有哪几种&#xff1f;把今天这篇文章耐心读完你就懂了&#xff01; 随着市场竞争的加剧和消费者需求的多样化&#xff0c;企业亟需灵活高效的…

spark的学习-03

RDD的创建的两种方式&#xff1a; 方式一&#xff1a;并行化一个已存在的集合 方法&#xff1a;parallelize 并行的意思 将一个集合转换为RDD 方式二&#xff1a;读取外部共享存储系统 方法&#xff1a;textFile、wholeTextFile、newAPIHadoopRDD等 读取外部存储系统的数…

Python练习10

Python日常练习 题目&#xff1a; 编写程序&#xff0c;输出如下所示图案。 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 要求&#xff1a; 使用for循环的方式完成 --------------------------------------------------------- 注意&#xff1a; …

【云原生开发】K8S多集群资源管理平台架构设计

✨✨ 欢迎大家来到景天科技苑✨✨ &#x1f388;&#x1f388; 养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; &#x1f3c6; 作者简介&#xff1a;景天科技苑 &#x1f3c6;《头衔》&#xff1a;大厂架构师&#xff0c;华为云开发者社区专家博主&#xff0c;…

「iOS」——知乎日报一二周总结

知乎日报仿写 前言效果Manager封装网络请求线程冲突问题下拉刷新添加网络请求的图片通过时间戳和日期格式化获取时间 总结 前言 前两周内容的仿写&#xff0c;主要完成了首页的仿写&#xff0c;进度稍慢。 效果 Manager封装网络请求 知乎日报的仿写需要频繁的申请网络请求&am…

【ArcGISPro】汉化嵌入的NoteBook界面

效果展示 下载Notebook汉化包 pip install jupyterlab-language-pack-zh-CN 添加环境变量 LANG zh_CN.UTF8 汉化结果