【C++】STL----list常见用法

news2024/11/13 14:42:03

🔥个人主页🔥:孤寂大仙V
🌈收录专栏🌈:C++从小白到高手
🌹往期回顾🌹:[C++]vector常见用法
🔖 流水不争,争的是滔滔不息。

文章目录

  • 一、list的介绍
    • list的主要特点
  • 二、list的使用
    • list的构造
    • list的迭代器使用
    • list的空间问题
    • list的元素访问
    • list的插入与删除
    • 迭代器失效问题
    • list和vector对比


一、list的介绍

在C++中,std::list 是一种双向链表数据结构,属于C++标准模板库(STL)中的容器之一。与std::vector相比,std::list在某些操作上有不同的性能特点,尤其是在频繁的插入和删除操作时具有优势。

list的主要特点

  1. 双向链表:std::list 是一个双向链表,意味着每个元素都有指向前后元素的指针。与数组不同,它不是连续的内存块。
  2. 高效的插入和删除:在链表中,插入和删除元素只需要修改指针,因此在任意位置插入或删除元素的效率较高,特别是当操作位置已知时(O(1)时间复杂度)。
  3. 不支持随机访问:与std::vector不同,std::list不支持通过索引直接访问元素(不能通过list[i]的方式访问)。如果要访问某个元素,通常需要使用迭代器来逐个遍历,效率为O(n)。

二、list的使用

list的构造

在这里插入图片描述

在这里插入图片描述
构造的list中包含n个值为val的元素

list<int> l1(5, 1);

在这里插入图片描述
构造空的list

list<int> l2;

在这里插入图片描述
拷贝构造函数

list<int> l3(5,3);
list<int> l4(l3);
paint_list(l4);

在这里插入图片描述
用(first,list)区间的元素构造list

vector<int> v4{ 1,2,3,4,5 };
list<int> l4(v4.begin(), v4.end());
paint_list(l4);

在这里插入图片描述

list的迭代器使用

在这里插入图片描述
在这里插入图片描述
begin和end返回第一个元素的迭代器+返回最后一个元素下一个位置的迭代器

rbegin和rend,rbegin是容器里的最后一个元素,rend是容器里的第一个元素。相当于begin+end迭代器反了过来。

list<int> l5{ 1,2,3,4,5 };
list<int> l6(l5.begin(), l5.end());
list<int> l7(l5.rbegin(), l5.rend());
paint_list(l6);
paint_list(l7);

在这里插入图片描述

list的空间问题

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

list<int> l6(5, 6);
list<int> l7;
cout<<l6.empty()<<endl;
cout<<l7.empty()<<endl;

在这里插入图片描述
返回list中有效节点

list<int> l7(5, 7);
cout << l7.size() << endl;

在这里插入图片描述

list的元素访问

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

list<int> l8{ 1,2,3,4,5 };
cout << l8.front() << endl;
cout << l8.back() << endl;

在这里插入图片描述

list的插入与删除

在这里插入图片描述
在这里插入图片描述
在list首元素前插入值为val的元素

list<int> l9(5, 9);
l9.push_front(1);
paint_list(l9);

在这里插入图片描述
删除list中的第一元素

list<int> l10{ 1,2,3,4,5 };
l10.pop_front();
paint_list(l10);

在这里插入图片描述
在list尾部插入值为val的元素

list<int> l11{ 1,2,3,4,5 };
l11.push_back(6);
paint_list(l11);

在这里插入图片描述
删除list中最后一个元素

list<int> l12{ 1,2,3,4,5 };
l12.pop_back();
paint_list(l12);

在这里插入图片描述
在pop位置插入值为val的元素

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);

for (auto e : lt)
{
	cout << e << " ";
}
cout << endl;

auto it = lt.begin();
int k = 3;
while (k--)
{
	++it;
}

lt.insert(it, 30);

for (auto e : lt)
{
	cout << e << " ";
}
cout << endl;

在这里插入图片描述
删除pos位置的元素

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);

for (auto e : lt)
{
	cout << e << " ";
}
cout << endl;

auto it = lt.begin();
int k = 3;
while (k--)
{
	++it;
}

lt.erase(it);

for (auto e : lt)
{
	cout << e << " ";
}
cout << endl;

在这里插入图片描述
交换两个list中的元素

list<int> l15(15, 7);
list<int> l16(15, 8);
paint_list(l15);
paint_list(l16);

swap(l15, l16);
paint_list(l15);
paint_list(l16);

在这里插入图片描述
清理list中的有效元素

list<int> l16(15, 7);
paint_list(l16);
l16.clear();
paint_list(l16);

在这里插入图片描述

迭代器失效问题

此处大家可将迭代器暂时理解成类似于指针, 迭代器失效即迭代器所指向的节点的无 效,即该节点被删除了 。因为 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 ())
{
// erase() 函数执行后, it 所指向的节点已被删除,因此 it 无效,在下一次使用 it 时,必须先给
其赋值
l . erase ( 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 ())
{
l . erase ( it ++ ); // it = l.erase(it);
}
}  

list和vector对比

在这里插入图片描述

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

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

相关文章

【C++】list容器的基本使用

一、list是什么 list的底层结构是带头双向循环链表。 相较于 vector 的连续线性空间&#xff0c;list 就显得复杂很多&#xff0c;它是由一个个结点构成&#xff0c;每个结点申请的空间并不是连续的&#xff0c;它的好处是每次插入或删除一个数据&#xff0c;就配置或释放一个…

WebServer:log

超时锁的编写 这个问题处于blockqueue.h文件中&#xff0c;内容如下&#xff1a; template<class T> bool BlockDeque<T>::pop(T& item, int timeout) {std::unique_lock<std::mutex> locker(mtx_);while(deq_.empty()) {if(condConsumer_.wait_for(lo…

内存泄漏

文章目录 内存泄漏发现问题topVisualVMArthas 原因分析代码层面并发请求 诊断问题MAT原理 –支配树获取运行时快照 内存泄漏 内存泄漏&#xff08;memory leak&#xff09;&#xff1a;在Java中如果不再使用一个对象&#xff0c;但是该对象依然在GC ROOT的引用链上&#xff0c;…

12.第二阶段x86游戏实战2-CE找基地址

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 本次游戏没法给 内容参考于&#xff1a;微尘网络安全 本人写的内容纯属胡编乱造&#xff0c;全都是合成造假&#xff0c;仅仅只是为了娱乐&#xff0c;请不要…

全网最全:企业微信用户授权登录对接完整流程

Hello&#xff01;欢迎各位新老朋友来看小弟博客&#xff0c;祝大家事业顺利&#xff0c;财源广进&#xff01;&#xff01; 主题&#xff1a;企业微信用户授权与校验完整对接流程 一&#xff1a;构造第三方应用授权链接 如果第三方应用需要在打开的网页里面携带用户的身份信息…

吸尘器制造5G智能工厂物联数字孪生平台,推进制造业数字化转型

吸尘器制造行业&#xff0c;作为传统制造业的重要组成部分&#xff0c;也在积极探索如何通过先进技术实现生产模式的创新升级。5G智能工厂与物联数字孪生平台的融合应用&#xff0c;为吸尘器制造业的数字化转型铺设了一条高速通道&#xff0c;不仅极大地提升生产效率&#xff0…

华为---代理ARP简介及示例配置

目录 1. 概念 2. 前提条件 3. 使用环境 4. 工作过程 5. 优点 6. 缺点 7. 示例配置 7.1 示例场景 7.2基本配置 7.3 配置端口隔离 7.4 开启代理ARP 7.4.1 VLAN内代理ARP 7.4.2 VLAN间代理ARP 7.4.3路由式ARP代理 1. 概念 代理ARP&#xff08;Proxy ARP&#xff09;&…

GAMES202 作业1

参考&#xff1a;games202作业1 SM 首先是利用shadow map去生成尝试生成硬阴影。根据作业的要求 我们完成光源对物体的mvp矩阵 CalcLightMVP(translate, scale) {let lightMVP mat4.create();let modelMatrix mat4.create();let viewMatrix mat4.create();let projection…

Bigemap GIS Office 2024注册机 全能版地图下载软件

对于需要利用GIS信息进行编辑、设计的用户来说&#xff0c;Bigemap GIS Office占有重要地位。用户可以使用Bigemap GIS Office作为工具进行设计、分析、共享、管理和发布地理信息。Bigemap GIS Office能实现多种数据流转、嵌入、融合以及更多地为用户提供数据的增强处理及多种分…

文心一言 VS 讯飞星火 VS chatgpt (351)-- 算法导论24.1 2题

二、证明推论24.3。推论 24.3 的内容是设 G ( V , E ) G(V,E) G(V,E)是一带权重的源结点为 s s s的有向图&#xff0c;其权重函数为 ω : E → R ω:\boldsymbol{E→R} ω:E→R。假定图 G G G不包含从源结点 s s s可以到达的权重为负值的环路&#xff0c;则对于所有结点 v ∈ …

完美转发、C++11中与线程相关的std::ref

目录 模板中的万能引用 std::forward实现完美转发 C11中与线程相关的std::ref 线程函数参数 用函数指针作为线程函数 用lambda表达式作为线程函数 模板中的万能引用 void Func(int& x) {cout << "左值引用" << endl; } void Func(int&&am…

spark之不同序列化对比

一&#xff0c;spark的rdd的序列话不同介绍 下面是使用不同序列化后的占用资源和数据大小 2&#xff0c;sparksql中序列化的区别 sparksql中使用序列化和不使用差别不大&#xff0c;英文sparksql中默认使用了encode自己实现的序列化方法&#xff0c;加上与不加序列化差别不大…

基于PHP+MySQL组合开发的在线客服源码系统 聊天记录实时保存 带完整的安装代码包以及搭建部署教程

系统概述 随着互联网技术的飞速发展&#xff0c;企业与客户之间的沟通方式日益多样化&#xff0c;在线客服系统作为连接企业与客户的桥梁&#xff0c;其重要性不言而喻。然而&#xff0c;市场上现有的在线客服系统往往存在成本高、定制性差、维护复杂等问题。针对这些痛点&…

Zabbix 6.4添加中文语言

/usr/share/zabbix/include/locales .inc .phplocale -agrep “zh_CN" yum install langpacks-zh_CN.noarch y y y

【千帆AppBuilder】零代码+组件+代码节点方式实现AI应用《法定退休年龄计算器》

欢迎来到《小5讲堂》 这是《千帆》系列文章&#xff0c;每篇文章将以博主理解的角度展开讲解。 温馨提示&#xff1a;博主能力有限&#xff0c;理解水平有限&#xff0c;若有不对之处望指正&#xff01; 目录 背景创建应用基本信息角色指令引导信息 组件整体界面开始节点代码节…

大腾智能3D协同平台通过华为云云软件认证

在数字化浪潮的推动下&#xff0c;工业软件不仅是研发和生产的核心工具&#xff0c;更是创新突破的基础&#xff0c;正成为推动工业领域数字化转型的关键力量。 近日&#xff0c;深圳市大腾信息技术有限公司凭借在技术创新与产品优化方面的卓越表现&#xff0c;再次迎来里程碑…

望繁信科技受邀出席ACS2023,为汽车行业数智化护航添翼

2023年5月25-26日&#xff0c;ACS2023第七届中国汽车数字科技峰会在上海成功举行。此次峰会汇聚了众多汽车领域的顶级专家、产业链代表及企业高管&#xff0c;共同探讨当今汽车产业的转型与未来发展趋势。 作为唯一受邀的流程挖掘厂商代表&#xff0c;望繁信科技携最新行业优势…

对于C++继承中子类与父类对象同时定义其析构顺序的探究

思考这样一串代码的运行结果&#xff1a; #include <iostream> using namespace std; class Person { public:~Person() { cout << "~Person()" << endl; } }; class Student:public Person { public:~Student() { cout << "~Student(…

【C++篇】C++类与对象深度解析(六):全面剖析拷贝省略、RVO、NRVO优化策略

文章目录 C类与对象前言读者须知RVO 与 NRVO 的启用条件如何确认优化是否启用&#xff1f; 1. 按值传递与拷贝省略1.1 按值传递的概念1.2 示例代码1.3 按值传递的性能影响1.3.1 完全不优化 1.4 不同编译器下的优化表现1.4.1 Visual Studio 2019普通优化1.4.2 Visual Studio 202…

828华为云征文|基于华为云Flexus X实例快速搭建Halo博客平台

目录 前言 一、Flexus云服务器X介绍 1.1 Flexus云服务器X实例简介 1.2 Flexus云服务器X实例特点 1.3 Flexus云服务器X实例场景需求 二、Flexus云服务器X购买 2.1 Flexus X实例购买 2.2 购买MySQL加速镜像 2.3 重置密码 2.4 登录服务器 三、Flexus X实例安装Docker 3.1 系统版本…