码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • C++之list


    目录

    一、关于list

    二、list相关函数

    三、相关函数的使用

    1、构造函数

    2、push_back

    3、迭代器

    4、push_front

    5、pop_back

    6、insert

    7、erase

    关于迭代器失效问题

    8、splice

    9、remove

    10、sort


    一、关于list

    list和string、vector一样,都是容器,都有很强的相似性,再学习完string和vector后,list应该也要能做到精准的使用

    list实际是带头双向循环链表

    二、list相关函数

    三、相关函数的使用

    list的使用和string、vector都差不多,下面就简单举一些样例理解即可

    1、构造函数

    一般都是第一种构造:无参构造


    2、push_back

    push_back尾插


    3、迭代器

    list不同于string、vector,不能用[]遍历,因为没有连续的存储空间,只能用迭代器遍历

    如下:

    当然支持迭代器就支持范围for,范围for底层就是迭代器

    正向迭代器是上面演示的,反向迭代器用法一样:


    4、push_front

    push_front是头插(时间复杂度是O(1))


    5、pop_back

    pop_back是尾删

    原本是4 3 2 1 尾删两次变为了4 3


    6、insert

    insert是插入数据

    第一种是pos位置插入val

    第二种是pos位置插入n个val

    第三种是插入一个迭代器区间

    并且insert和erase是与find结合起来使用的

    同样和vector一样,find是在algorithm的头文件里包含的,find没有找到就会返回last,所以需要用if语句判断是否找到

    即如下图,在2的前面插入20


    7、erase

    erase是删除数据

    并且erase没有找到的话也是返回last,所以也要和insert一样,用if语句判断

    如下图,删除2


    关于迭代器失效问题

    迭代器是类似指针的一个东西,迭代器失效是指对应的指针已经被销毁,而依然使用被销毁的那段空间

    就如上面的insert迭代器就不失效,因为insert插入到2前面的位置,只是在链表中增加一个结点,并不改变他们的关系,并且指针指向的空间并没有被销毁

    而erase 2 以后,就发生了迭代器失效的问题了,因为删除2,2结点的位置已经释放了,而指针依旧指向那个位置,如果继续使用,则会发生程序崩溃的问题,如下所示:

    在pos位置已经删除2,相当于pos所指向的位置已经释放了,又继续使用pos,改变pos位置的值

    这时一执行,就会报以下错误:

    这就是典型的迭代器失效问题


    8、splice

    splice是转移数据

    我们只列举第一种用法,是将x链表的内容转移到pos位置

    有两个链表,一个链表l是1 2 3 4,一个链表r是5 6 7,我们找到l链表的pos位置,即第二个数据的位置,在该位置转移了整个r链表的数据,所以变为了1 5 6 7 2 3 4


    9、remove

    remove是删除值为val的数据

    现在有一个链表是1 2 3 4 4 4,我们remove(4)

    观察结果可知,remove是删除所有值为4的数


    10、sort

    sort是排序算法

    在vector中我们说到过,头文件algorithm中也有sort算法,但为什么list需要自己给一个sort算法呢?

    理由很简单,因为algorithm头文件中的sort只支持存储空间连续的容器,因为排序算法中的sort实际是快排,而list存储空间并不是,所以得自己实现

    直接l.sort()即可,默认升序

    而如果想排降序,则用sort的第二个用法,即传入仿函数函数

    升序的仿函数是less,降序是greater,但是用greater时需要包含头文件functional

    如下图所示,传入匿名对象即可:

  • 相关阅读:
    工程实践 穿越CICD那些事
    主流DVR/NVR视频接入介绍:NVR接入视频监控平台的方法(视频监控接入NVR最详细最全面的介绍)
    转铁蛋白偶联糖(单糖/多糖),(Transferrin)TF-PEG-Dextran葡聚糖/Lysozyme溶菌酶
    Vue混入mixins,让你减少一半代码
    翻译软件-好用的翻译软件-免费翻译软件大全
    他来了他来了,.net开源智能家居之苹果HomeKit的c#原生sdk【Homekit.Net】1.0.0发布,快来打造你的私人智能家居吧
    压缩算法:基于FPGA的Varint编码实现(附代码)
    3DTiles三维管线数据生产工具试用版
    对象和数据结构
    多数据源配置
  • 原文地址:https://blog.csdn.net/m0_64411530/article/details/132859481
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号