【STL】:list用法详解

news2025/1/15 13:11:09

朋友们、伙计们,我们又见面了,本期来给大家解读一下有关list的使用,如果看完之后对你有一定的启发,那么请留下你的三连,祝大家心想事成!

C 语 言 专 栏:C语言:从入门到精通

数据结构专栏:数据结构

个  人  主  页 :stackY、

C + + 专 栏   :C++

Linux 专 栏  :Linux


目录

1. list的介绍

2. list的使用

2.1 list的定义

2.2 迭代器

2.3 空间增长

2.4 访问

2.5 修改 

3. list的迭代器失效 


1. list的介绍

list官方文档参考

类似于数据结构中讲到过的双向带头循环链表

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

2. list的使用

list学习时一定要学会查看文档:list官方文档参考,list在实际中非常的重要,在实际中我们熟悉常见的接口就可以,下面列出了哪些接口是要重点掌握的。

2.1 list的定义

构造函数( (constructor))接口说明
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

在使用list之前需要包含list对应的头文件:#include <list> 

void list_test1()
{
	//空构造
	list<int> lt1;
	//n个val
	list<string> lt2(10, "0x0");
	//迭代器区间
	vector<int> v = { 0,1,2,3,4,5,6,7,8,9 };
	list<int> lt3(v.begin() + 2, v.end());
	//拷贝构造
	list<string> lt4(lt2);
}

2.2 迭代器

函数声明接口说明
begin +
end
返回第一个元素的迭代器+返回最后一个元素下一个位置的迭代器
rbegin +
rend
返回第一个元素的reverse_iterator,即end位置,返回最后一个元素下一个位置的
reverse_iterator,即begin位置

void list_test2()
{
	list<int> lt;
	lt.push_back(1);
	lt.push_back(2);
	lt.push_back(3);
	lt.push_back(4);

	//正向迭代器
	list<int>::iterator it = lt.begin();
	//auto it = lt.begin();
	while (it != lt.end())
	{
		cout << *it << " ";
		it++;
	}
	cout << endl;
	//反向迭代器
	list<int>::reverse_iterator rit = lt.rbegin();
	//auto rit = lt.rbegin();
	while (rit != lt.rend())
	{
		cout << *rit << " ";
		rit++;
	}
	cout << endl;
	
	//范围for
	for (auto e : lt)
	{
		cout << e << " ";
	}
	cout << endl;
}

2.3 空间增长

函数声明接口说明
empty检测list是否为空,是返回true,否则返回false
size返回list中有效节点的个数

void list_test3()
{
	list<int> lt;
	lt.push_back(1);
	lt.push_back(2);
	lt.push_back(3);
	lt.push_back(4);

	cout << lt.empty() << endl;
	size_t sz = lt.size();
	cout << sz << endl;
}

2.4 访问

函数声明接口说明
front返回list的第一个节点中值的引用
back返回list的最后一个节点中值的引用

void list_test4()
{
	list<int> lt;
	lt.push_back(1);
	lt.push_back(2);
	lt.push_back(3);
	lt.push_back(4);

	cout << lt.front() << endl;
	cout << lt.back() << endl;
}

 

2.5 修改 

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

void list_test5()
{
	list<int> lt;
	lt.push_back(1);
	lt.push_back(2);
	lt.push_back(3);
	lt.push_back(4);

	//头插
	lt.push_front(0);
	//尾插
	lt.push_back(5);
	//头删
	lt.pop_front();
	//尾删
	lt.pop_back();

	//pos位置插入
	list<int>::iterator lit = lt.begin();
	++lit;
	lt.insert(lit, 30);
	
	//在pos位置插入n个数据
	--lit;
	lt.insert(lit, 2, 10);

	//迭代器区间插入
	vector<int> v = { 10,20 };
	++lit;
	lt.insert(lit, v.begin(), v.end());
	//范围for
	for (auto e : lt)
	{
		cout << e << " ";
	}
	cout << endl;
}

void list_test6()
{
	list<int> lt;
	lt.push_back(1);
	lt.push_back(2);
	lt.push_back(3);
	lt.push_back(4);

	list<int>::iterator lit1 = lt.begin();

	//删除pos位置
	lt.erase(lit1);

	//删除一段迭代器区间
	lt.erase(lt.begin(), lt.end());
	
	//范围for
	for (auto e : lt)
	{
		cout << e << " ";
	}
	cout << endl;
}
void list_test7()
{
	list<int> lt1;
	lt1.push_back(1);
	lt1.push_back(2);
	lt1.push_back(3);
	lt1.push_back(4);
	list<int> lt2;
	lt2.push_back(4);
	lt2.push_back(3);
	lt2.push_back(2);
	lt2.push_back(1);

	//交换
	lt1.swap(lt2);
	//清理
	lt1.clear();
	lt2.clear();
}

3. list的迭代器失效 

前面说过,此处可将迭代器暂时理解成类似于指针,迭代器失效即迭代器所指向的节点的无效,即该节点被删除了。因为list的底层结构为带头结点的双向循环链表,因此在list中进行插入时是不会导致list的迭代器失效的,只有在删除时才会失效,并且失效的只是指向被删除节点的迭代器,其他迭代器不会受到影响。
(具体细节在模拟实现时进行解释)

void list_test8()
{
	list<int> lt1;
	lt1.push_back(1);
	lt1.push_back(2);
	lt1.push_back(3);
	lt1.push_back(4);
	auto lit = lt1.begin();
	while (lit != lt1.end())
	{
		lt1.erase(lit);
		// erase()函数执行后,it所指向的节点已被删除,
		// 因此it无效,在下一次使用it时,必须先给其赋值
		lit++;
	}
}

改正写法:

void list_test8()
{
	list<int> lt1;
	lt1.push_back(1);
	lt1.push_back(2);
	lt1.push_back(3);
	lt1.push_back(4);
	auto lit = lt1.begin();
	while (lit != lt1.end())
	{
		lit = lt1.erase(lit);
		//或者
		//lt1.erase(lit++);
		lit++;
	}
}

朋友们、伙计们,美好的时光总是短暂的,我们本期的的分享就到此结束,欲知后事如何,请听下回分解~,最后看完别忘了留下你们弥足珍贵的三连喔,感谢大家的支持!  

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

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

相关文章

SQL注入思路扩展

目录 一、资产搜集 二、开始sql注入常规流程 三、sqlmap验证 总结&#xff1a;测试sql注入的时候不要只局限于明文传输&#xff0c;也要注意编码或者加密后的值。 还没看够&#xff1f;欢迎关注&#xff0c;带你走进黑客世界&#xff0c;下面也有免费的靶场视频 一、资产搜…

HCIA --- 综合实验(结束)

一、实验拓扑及要求 二、整体IP规划 三、解决方案 四、解决步骤配置命令 一、基本部分 一、交换机 1、创建对应VLAN&#xff0c;对应接口划入对应VLAN中&#xff0c;创建Trunk干道&#xff0c;配置HTTP服务器IP LSW1 [sw1]vlan batch 2 to 3 [sw1]interface e0/0/1 [sw1-E…

idea提交代码一直提示 log into gitee

解决idea提交代码一直提示 log into gitee问题 文章目录 打开setting->Version control->gitee,删除旧账号&#xff0c;重新配置账号&#xff0c;删除重新登录就好 打开setting->Version control->gitee,删除旧账号&#xff0c;重新配置账号&#xff0c;删除重新登…

部署前端项目到宝塔面板(腾讯阿里服务器均适用)

写在前面&#xff0c;本网站部署的是前端nuxt.js项目&#xff0c;后端部分在本人的其他博文&#xff0c;请移步 【起步】服务器端 打开自己的轻量服务器的管理面板 确保服务器已经打开&#xff0c;如下图所示 来到域名列表&#xff0c;解析域名&#xff0c;如下图所示 的…

[转载]C++序列化框架介绍和对比

Google Protocol Buffers Protocol buffers 是一种语言中立&#xff0c;平台无关&#xff0c;可扩展的序列化数据的格式&#xff0c;可用于通信协议&#xff0c;数据存储等。 Protocol buffers 在序列化数据方面&#xff0c;它是灵活的&#xff0c;高效的。相比于 XML 来说&…

怎么理解电流超前电压、电压超前电流?

电容和电感&#xff0c;电压超前电流&#xff0c;电流超前电压都是我们经常听到的。作为非专业人士&#xff0c;这些听起来确实有点摸不着头脑&#xff0c;今天特别查了下电容、电感、电压电流相关资料&#xff0c;总算是弄明白了&#xff0c;在此特地记录下&#xff01; 1. 电…

打造企业级门户,WorkPlus助您打造个性化与高效的企业通讯平台

在现代企业运营中&#xff0c;良好的内部沟通与信息管理至关重要。为满足企业对于高效沟通与信息发布的需求&#xff0c;WorkPlus推出了企业门户APP&#xff0c;为企业提供全新的信息管理与沟通协作体验。 作为一站式企业门户&#xff0c;WorkPlus连接了组织、员工和信息的纽带…

GitLab(2)——Docker方式安装Gitlab

目录 一、前言 二、安装Gitlab 1. 搜索gitlab-ce镜像 2. 下载镜像 3. 查看镜像 4. 提前创建挂载数据卷 5. 运行镜像 三、配置Gitlab文件 1. 配置容器中的/etc/gitlab/gitlab.rb文件 2. 重启容器 3. 登录Gitalb ① 查看初始root用户的密码 ② 访问gitlab地址&#…

阿里云国际版和国内版的区别是什么,为什么很多人喜欢选择国际版?

阿里云国际版和国内版区别如下&#xff1a; 谈到区别&#xff0c;我们不妨先来对比下相同点与不同点&#xff0c;才能清晰明确的知道二者区别 下面先介绍不同点&#xff1a; 面向市场更广泛 阿里云国际版主要是面向国际&#xff08;全球&#xff09;客户的&#xff0c;而国内…

如何用ChatGPT快速写出一份合格的PPT报告

我们【AI写稿专家】的小伙伴中有很多企业高管和公务员&#xff0c;大家经常有写报告写ppt的需求&#xff0c;下面小编给大家介绍一下我们新发布生成PPT的功能&#xff0c;很简单很方便&#xff0c;看完大家不到1分钟就能生成一份拿得出手的PPT报告&#xff0c;再也不用费尽心思…

华为云之使用CCE云容器引擎部署Nginx应用【玩转华为云】

华为云之使用CCE云容器引擎部署Nginx应用【玩转华为云】 一、本次实践介绍1.本次实践简介2.本次实践目的 二、CEE介绍1.CCE简介2.CCE产品链接 三、创建虚拟私有云VPC1.访问VPC2.创建VPC3.查看VPC列表 四、创建密钥对1.进入密钥对界面2.创建密钥对3.保存密钥文件到本地 五、创建…

Softing dataFEED OPC Suite将西门子PLC数据存储到Oracle数据库中

一 背景 现代工业产品生产批量大、过程自动化程度高&#xff0c;这对于用户追溯产品设计与制造过程中产生的数据而言&#xff0c;无疑是一大新挑战。与此同时&#xff0c;制造商们对产品制造过程中产生的大量工艺数据也愈发重视&#xff0c;并在不断寻求存储与分析产品制造数据…

【zTree】节点添加不同操作按钮,点击后生成弹窗

zTree api 文档&#xff1a;https://www.treejs.cn/v3/api.php 1. 初始化树的配置项 const initZtreeSetting () > {const setting {view: {addHoverDom: addHoverDom, // 显示用户自定义控件selectedMulti: false,// 是否允许同时选中多个节点&#xff0c;默认为truesh…

HarmonyOS鸿蒙原生应用开发设计- 隐私声明

HarmonyOS设计文档中&#xff0c;为大家提供了独特的隐私声明&#xff0c;开发者可以根据需要直接引用。 开发者直接使用官方提供的隐私声明内容&#xff0c;既可以符合HarmonyOS原生应用的开发上架运营规范&#xff0c;又可以防止使用别人的内容产生的侵权意外情况等&#xff…

程序开发官网地址汇总

这里写目录标题 官网地址汇总开发环境开发工具数据库驱动包其他 官网地址汇总 开发环境 1 JDK &#xff1a;https://www.oracle.com/java/technologies/java-se-glance.html 2 Maven&#xff1a;https://maven.apache.org/download.cgi 3 Maven Repository: https://mvnrep…

启动U盘制作工具------------Ventoy 最新版 v1.0.96

Ventoy最新版是一款功能强大的启动U盘制作工具,Ventoy最新版支持多系统启动盘的制作功能,Ventoy最新版一次还可以拷贝很多个不同类型的ISO文件,软件支持自动安装部署、支持超过4GB的ISO文件、支持大部分常见操作系统和无差异支持Legacy+UEFI模式。软件能够直接启动WIM文件。…

搜索语法备忘

搜索途径 传统搜索引擎&#xff1a;Goolge、Bing、Sogou、Baidu微信搜一搜视频内容&#xff1a;哔哩哔哩、抖音AI&#xff1a;文言一心、ChatGPT 传统搜索引擎中&#xff0c;Goolge 和 Sogou 可以搜索到微信公众号的内容。这很重要&#xff0c;根据我的主观感受&#xff0c;微…

PSP - 蛋白质复合物 AlphaFold2 Multimer MSA Pairing 逻辑与优化

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://spike.blog.csdn.net/article/details/134144591 在蛋白质复合物结构预测中&#xff0c;当序列 (Sequence) 是异源多链时&#xff0c;无论是AB&#xff0c;还是AABB&#xff0c;都需要 …

Python实现hellokitty

目录 系列文章 前言 绘图基础 HelloKitty 尾声 系列文章 序号文章目录直达链接1浪漫520表白代码https://want595.blog.csdn.net/article/details/1306668812满屏表白代码https://want595.blog.csdn.net/article/details/1297945183跳动的爱心https://want595.blog.csdn.n…

山西电力市场日前价格预测【2023-11-01】

日前价格预测 预测说明&#xff1a; 如上图所示&#xff0c;预测明日&#xff08;2023-11-01&#xff09;山西电力市场全天平均日前电价为280.90元/MWh。其中&#xff0c;最高日前电价为420.61元/MWh&#xff0c;预计出现在18:00。最低日前电价为0.00元/MWh&#xff0c;预计出…