【C++】list常见用法

🔥个人主页🔥:孤寂大仙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.xdnf.cn/news/142784.html

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

相关文章

web安全测试入门

参考课程&#xff1a; 04-软件安全测试基础-网络协议基础-网络模型_哔哩哔哩_bilibili 1.软件安全测试概述 安全测试&#xff1a; 安全性测试指有关验证应用程序的安全等级和识别潜在安全性缺陷的过程 导致软件出现安全问题的主要原因或根源是软件的安全漏洞 安全漏洞&#x…

Vue2源码解读

vue源码_哔哩哔哩_bilibili 1.Vue源码路径目录解读 Vue2源码的路径目录被设计得非常清晰&#xff0c;每个文件夹都承担着特定的职责和功能。以下是这些主要文件夹&#xff08;compiler、core、platform、server、sfc、shared&#xff09;的详细解读&#xff1a; 1. compiler …

变压器漏感对整流电路的影响

目录 1. 电压波形畸变 2. 输出电压波动 3. 电流纹波增加 4. 降低整流效率 5. 影响开关器件的性能 6. EMI&#xff08;电磁干扰&#xff09;增加 总结与应对措施 变压器漏感在整流电路中会产生一些影响&#xff0c;尤其在高频应用或电流变化较大的情况下&#xff0c;其影…

【Java】多线程:Thread类并行宇宙

欢迎浏览高耳机的博客 希望我们彼此都有更好的收获 感谢三连支持&#xff01; 在现代编程中&#xff0c;多线程是提高程序性能和响应能力的一种重要手段。Java 通过 Thread 类和 Runnable 接口提供了丰富的线程管理功能。本文是对 Thread 类基本用法的总结。 线程创建 线程可以…

GEE 案例:利用2001-2024年的MODIS数据长时序ndvi指数归一化后的结果分析

目录 简介 指数 数据 代码 结果 简介 利用2001-2024年的MODIS数据长时序ndvi指数归一化后的结果分析&#xff0c;并加载时序图。 指数 NDVI指数&#xff08;Normalized Difference Vegetation Index&#xff09;是用来评估地表植被覆盖度和健康程度的指数。它通过计算红…

PMP--一模--解题--121-130

文章目录 12.采购管理--投标人会议&#xff08;又称承包商会议、供应商会议或投标前会议&#xff09;是在卖方提交建议书之前&#xff0c;在买方和潜在卖方之间召开的会议&#xff0c;其目的是确保所有潜在投标人对采购要求都有清楚且一致的理解&#xff0c;并确保没有任何投标…

【数据结构取经之路】图解AVL树

目录 AVL树的前世今生 走进AVL AVL树的实现 1、AVL树节点的定义 2、AVL树的插入 3、完整代码 AVL树的性能 AVL树的前世今生 我们知道&#xff0c;普通的二叉搜索树在不少场景下可以提高我们的查找效率。例如下面这种情况&#xff0c;我们要找22。从根开始&#xff0c;…

搭建一个基于角色的权限验证框架

说明&#xff1a;基于角色的权限验证&#xff08;Role-Based Access Control&#xff0c;RBAC&#xff09;框架&#xff0c;是目前大多数服务端的框架。本文介绍如何快速搭建一个这样的框架&#xff0c;不用Shiro、Spring Security、Sa-Token这样的“大框架”实现。 RBAC 基于…

[Meachines] [Medium] Bart Server Monitor+Internal Chat+UA投毒+Winlogon用户密码泄露权限提升

信息收集 IP AddressOpening Ports10.10.10.81TCP:80 $ nmap -p- 10.10.10.81 --min-rate 1000 -sC -sV PORT STATE SERVICE VERSION 80/tcp open http Microsoft IIS httpd 10.0 | http-methods: |_ Potentially risky methods: TRACE |_http-server-header: Micros…

在沉浸式翻译中使用SiliconCloud API:提升翻译体验

沉浸式翻译&#xff0c;作为广受好评的双语对照网页翻译插件&#xff0c;结合了硅基流动&#xff08;SiliconFlow&#xff09;的大语言模型&#xff0c;为用户提供了快速、准确的跨语言翻译服务。自2023年上线以来&#xff0c;这款AI双语对照网页翻译扩展已帮助超过100万用户跨…

【C++11 —— 异常】

C —— 异常 C语言传统的处理错误的方式C异常概念异常的使用异常的抛出和捕获异常的重新抛出异常安全异常规范 自定义异常体系自定义异常体系的目的 C标准库的异常体系异常的优缺点 C语言传统的处理错误的方式 在C语言中&#xff0c;错误处理通常依赖于返回值和全局变量的方式…

【程序人生】《把时间当做朋友》李笑来思维导图

李笑来&#xff0c;男&#xff0c;朝鲜族&#xff0c;1972年7月12日生&#xff0c;吉林人&#xff0c;畅销书作家、区块链专家、天使投资人。 INBlockchain硬币资本创始人&#xff0c;投资了区块链项目。曾在央视采访中自曝拥有六位数比特币。 出版发行《把时间当做朋友》 [9]、…

LAMP环境搭建记录:基于VM的Ubuntu虚拟机

LAMP环境搭建记录&#xff1a;基于VM的Ubuntu虚拟机 我们从这样的角度出发&#xff1a; 一、简述LAMP环境 二、搭建LAMP环境 一、什么是LAMP环境 首先&#xff0c;该词是复合&#xff1a; ​ LAMP Linux Apache MySQL PHP 其中&#xff0c;逐项简述为&#xff1a; …

代码随想录算法训练营第57天|卡码网 53. 寻宝 prim算法精讲和kruskal算法精讲

1. prim算法精讲 题目链接&#xff1a;https://kamacoder.com/problempage.php?pid1053 文章链接&#xff1a;https://www.programmercarl.com/kamacoder/0053.寻宝-prim.html prim算法 是从节点的角度 采用贪心的策略 每次寻找距离 最小生成树最近的节点 并加入到最小生成树中…

MoCo和SimCLR【CV双雄】

文章目录 文章列表五、MoCo V15.1 文章摘要5.2 实验结果5.3 文章图示图 1: Momentum Contrast (MoCo) 训练方法概述图 2: 三种对比损失机制的比较 六、SimCLR V16.1 文章摘要6.2 文章实验6.3 文章图示图 1: ImageNet Top-1 Accuracy of Linear Classifiers图 2: 对比学习框架图…

MySQL日志binlog和redo log区别

MySQL binlog简介 MySQL中有两类日志&#xff1a;binlog和redo log&#xff0c;分别有不同的作用和解决问题。binlog是归档日志&#xff0c;在MySQL server层的日志&#xff0c;适用于所有存储引擎&#xff0c;redo log是innodb特有日志用于crash-safe时恢复数据。 binlog和r…

【C++】—— list 模拟实现

【C】—— list 模拟实现 1 list 基础结构2 默认构造3 迭代器3.1 整体框架3.2 成员函数3.3 begin() 与 end() 的实现3.4 operator-> 的实现3.5 const 迭代器3.5.1 const 迭代器为什么命名 const_iterator3.5.2 const 迭代器的实现3.5.3 合并两个迭代器 4 源码 1 list 基础结…

【C++前后缀分解】1653. 使字符串平衡的最少删除次数|1793

前后缀分解 C前后缀分解 LeetCode1653. 使字符串平衡的最少删除次数 给你一个字符串 s &#xff0c;它仅包含字符 ‘a’ 和 b’​​​​ 。 你可以删除 s 中任意数目的字符&#xff0c;使得 s 平衡 。当不存在下标对 (i,j) 满足 i < j &#xff0c;且 s[i] ‘b’ 的同时…

软考中项(第三版):项目质量管理总结

前言 系统集成项目管理工程师考试&#xff08;简称软考中项&#xff09;&#xff0c;其中案例分析也是很大一部分考试内容&#xff0c;目前正在学习中&#xff0c;现总结一些可能会考到的知识点供大家参考。 1.1、项目质量管理总线索 1、质量管理的发展史 &#xff08;1&…

创建一个Java项目并在项目中新建文件,最后实现程序简单的输出

目录 前言 一、建立项目及新建Java类 二、输入简单代码实现输出 前言 1.本文所讲的是java程序设计语言&#xff0c;其内容是如何在id中新建一个项目&#xff0c;并新建一个Java文件&#xff0c;在其内输入相关代码并对其输出&#xff1b; 2.Java文件的编写以收入到我的专栏…