当前位置: 首页 > news >正文

【C++】list介绍

个人主页 : zxctscl
如有转载请先通知

文章目录

  • 1. list介绍
  • 2. list的构造
  • 3. ist iterator的使用
  • 4. capacity
  • 5. element access
  • 6. modifiers
  • 7. 迭代器失效
  • 8. Operations
    • 8.1 reverse
    • 8.2 sort
    • 8.3 unique
    • 8.4 splice

1. 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中的接口比较多,此处类似,只需要掌握如何正确的使用,然后再去深入研究背后的原理,已达到可扩展的能力。以下为list中一些常见的重要接口。

2. list的构造

在这里插入图片描述

3. ist iterator的使用

此处,大家可暂时将迭代器理解成一个指针,该指针指向list中的某个节点。
在这里插入图片描述
在这里插入图片描述
直接看代码:

    list<int> lt;lt.push_back(1);lt.push_back(2);lt.push_back(3);lt.push_back(4);lt.push_back(5);list<int>::iterator it = lt.begin();while (it != lt.end()){cout << *it << " ";it++;}cout << endl;for (auto e : lt){cout << e << " ";}cout << endl;

在这里插入图片描述

注意:

  1. begin与end为正向迭代器,对迭代器执行++操作,迭代器向后移动
  2. rbegin(end)与rend(begin)为反向迭代器,对迭代器执行++操作,迭代器向前移动

4. capacity

在这里插入图片描述

5. element access

在这里插入图片描述

6. modifiers

在这里插入图片描述

7. 迭代器失效

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

list的insert不会失效,但是erase会失效。
在这里插入图片描述

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()){l.erase(it++); // it = l.erase(it);}}

在这里插入图片描述

8. Operations

在这里插入图片描述

8.1 reverse

reverse逆置
来看看代码;

    list<int> lt;lt.push_back(1);lt.push_back(2);lt.push_back(3);lt.push_back(4);lt.push_back(5);for (auto e : lt){cout << e << " ";}cout << endl;lt.reverse();for (auto e : lt){cout << e << " ";}cout << endl;

在这里插入图片描述

8.2 sort

在这里插入图片描述
sort默认排的是升序,来看看代码:

    list<int> lt;lt.push_back(1);lt.push_back(2);lt.push_back(3);lt.push_back(4);lt.push_back(5);for (auto e : lt){cout << e << " ";}cout << endl;lt.reverse();for (auto e : lt){cout << e << " ";}cout << endl;lt.sort();for (auto e : lt){cout << e << " ";}cout << endl;

在这里插入图片描述
在这里插入图片描述
排降序的话,得加一个仿函数

    list<int> lt;lt.push_back(1);lt.push_back(2);lt.push_back(3);lt.push_back(4);lt.push_back(5);for (auto e : lt){cout << e << " ";}cout << endl;lt.sort(greater<int>());for (auto e : lt){cout << e << " ";}cout << endl;

在这里插入图片描述

8.3 unique

去重要求先排序在这里插入图片描述
来看看代码:

	list<int> lt;lt.push_back(1);lt.push_back(2);lt.push_back(3);lt.push_back(2);lt.push_back(2);lt.push_back(4);lt.push_back(5);lt.push_back(2);for (auto e : lt){cout << e << " ";}cout << endl;lt.sort();for (auto e : lt){cout << e << " ";}cout << endl;lt.unique();for (auto e : lt){cout << e << " ";}cout << endl;

在这里插入图片描述

8.4 splice

splice是转移的意思,但是转移的链表类型必须是相同的。
在这里插入图片描述
举个例子:把第一个位置的值拿出来,也就是1.然后2 3 4依此往前挪,最后插入到最后面。只是改变节点的指向。
在这里插入图片描述

代码:

    list<int> lt;lt.push_back(1);lt.push_back(2);lt.push_back(3);lt.push_back(4);for (auto e : lt){cout << e << " ";}cout << endl;lt.splice(lt.end(), lt, lt.begin());for (auto e : lt){cout << e << " ";}cout << endl;

在这里插入图片描述
在这里插入图片描述
也可以把一个链表的一部分转移到另一个节点上,
看代码:

	list<int> lt;lt.push_back(1);lt.push_back(2);lt.push_back(3);lt.push_back(4);for (auto e : lt){cout << e << " ";}cout << endl;list<int> lt1;lt.push_back(10);lt.push_back(20);lt.push_back(30);lt.push_back(40);lt.splice(lt.begin(), lt1);for (auto e : lt){cout << e << " ";}cout << endl;

在这里插入图片描述
有问题请指出,大家一起进步!!!

http://www.lryc.cn/news/332423.html

相关文章:

  • 【SQL Server】2. 将数据导入导出到Excel表格当中
  • 基于JAVA+SSM+VUE的前后端分离的大学竞赛管理系统
  • 音频转换工具 Bigasoft FLAC Converter for Mac
  • 洛谷 P4554 小明的游戏
  • 序列化案例实操(统计每一个手机号耗费的总上行流量、总下行流量、总流量)
  • 使用 LLMLingua-2 压缩 GPT-4 和 Claude 提示
  • 编程大牛坚持了 10 年的 10 个编程好习惯
  • QEMU上PAC功能验证与异常解析
  • 简约轻量-失信录系统源码
  • 前端入门系列-HTML-HTML常见标签(注释,标题,段落,换行)
  • 【mysql 第3-10条记录怎么查】
  • 1.Git是用来干嘛的
  • Git安装教程(图文安装)
  • SpringData ElasticSearch - 简化开发,完美适配 Spring 生态
  • 突破!AI机器人拥有嗅觉!仿生嗅觉芯片研究登上Nature子刊
  • 前端接口防止重复请求实现方案
  • 【leetcode面试经典150题】13.除自身以外数组的乘积(C++)
  • 网络编程核心概念解析:IP地址、端口号与网络字节序深度探讨
  • 突破编程_C++_网络编程(TCPIP 四层模型(网络层(1))
  • Java | Leetcode Java题解之第9题回文数
  • 极简云验证 download.php 文件读取漏洞复现
  • 红黑树路径长度分析:证明与实现
  • esp32 gpio初识(一)
  • python 自制黄金矿工游戏(设计思路+源码)
  • Splunk Attack Range:一款针对Splunk安全的模拟测试环境创建工具
  • OpenCV入门例程:裁剪图片、模糊检测、黑屏检测
  • opencv-python库 cv2边界填充resize图片
  • Java代码基础算法练习-负数个数统计-2024.04.04
  • 【算法刷题day17】Leetcode:110.平衡二叉树 257. 二叉树的所有路径 404.左叶子之和
  • C++ | Leetcode C++题解之第10题正则表达式匹配