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

C++:list篇

前言:

        观看C++的list前需要对链表有一些了解,如C语言的链表结构。本片仅介绍list容器中常用的接口函数概念以及使用。

list的概念:        

          简而言之,C++的list是一个双向带哨兵位的链表容器模板 

      

list的构造:

        1.list():默认构造

        2.list (const list& x) :拷贝构造函数

        3.list (InputIterator first, InputIterator last) 用[first, last)左闭右开的区间中的元素构造list.

        上图的输出打印是使用范围for进行打印,而范围for底层为list的迭代器。list的迭代器与vector、string的迭代器都不相同,这点小编会再下面进行大概讲解。

list迭代器(iterator)的使用:

        1.iterator begin();

        list的begin返回的是第一个有效节点的地址。

        2.iterator end();

                list的end返回的是哨兵为节点的地址。

     

        那么从上面的begin与end可以看出,使用迭代器遍历list,仅仅只需要解引用迭代器以及++迭代器就能取得我们想要的值与让迭代器走向下一个节点,那么有没有想过一个问题,list的迭代器与vector这种类似数组的迭代器底层是否是一样的呢?

        vector是一个天然的数组,而数组是一段连续的地址空间,vector的迭代器可以直接进行++就可以找到下一个数据的地址,解引用也可以直接访问数据

        而从上图的list是一个不连续的空间,单直接进行++的话会访问到当前节点+1的地址空间,那么此时就变成了野指针。并且对list迭代器进行*(解引用)操作如果单纯的来看,对it解引用会是一个节点,而并非节点内的数据。但根据输出可以看到list的迭代器与vector的迭代器使用起来并无差别

        但其实这是对list迭代器进行了封装操作,使得上层的使用看起来是一样的,但其实底层已经完全不一样了但为了方便理解list可暂时将迭代器理解成一个指针。

list capacity(容量)接口

        

        1.list.empty():判断当前链表是否为空

        

        empty函数是判断除哨兵位节点外是否还有其他节点,如果有则不为空,如果没有则为空.

        2.list.size():返回当前链表的节点个数

list的modifiers(修饰符)接口函数

        1.list.push_back

        2.list.insert:

    

        从上图可以看到,如果直接还是和之前vector一样向在第二个位置插入一个值,那么首先要让迭代器走到第二个位置,那么在list中是不能直接进行+2的操作,必须通过循环迭代到第二个位置。

        

       

        那么在insert里存不存在迭代器失效问题呢?

                答案是显而易见的,迭代器肯定是不会失效的,因为list不会涉及到扩容问题,同时此时pos也没有改变指向的位置,所以迭代器不会有失效的问题

        3.list.erase

                

        那么list的erase是否会有迭代器失效的问题?

        

        我们可以看到,当erase后如果在对it迭代器进行操作,vs则会进行强制检查(根据编译环境不同,处理环境也不相同),则不允许再继续使用,如果想继续使用的话,C++同样也给出了方案,可以看到erase会返回一个迭代器,而返回的迭代器就是下一个链表的位置。所以需要 it迭代器重新赋值就可以继续使用。

        4.list.swap

        

                5.list.clear

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 【60天备战软考高级系统架构设计师——第四天:需求获取与初步分析】
  • 站长神器,AI批量生成原创文章工具免费用还能自动发布到站点
  • Mysql-redo logs,binlog以及undo logs的作用及区别
  • llm 是泡沫?
  • 软件测试工程师必备的技术能力
  • 【通过h5作为中转页跳转到微信小程序】
  • LMDeploy 量化部署进阶实践
  • c++中的匿名对象及内存管理及模版初阶
  • 【自用16.】C++类
  • 组合式API-reactive和ref函数,computed计算属性,watch函数
  • Linux和Unix的区别及为什么鸿蒙系统不用Unix的原因
  • 排序算法(冒泡、插入、选择、快排、归并)原理动画及Python、Java实现
  • 进程、线程的区别
  • identYwaf:一款基于盲推理识别技术的WAF检测工具
  • LLM - GPT(Decoder Only) 类模型的 KV Cache 公式与原理 教程
  • 30秒的PHP代码片段(1)数组 - Array
  • HTTP那些事
  • iOS高仿微信项目、阴影圆角渐变色效果、卡片动画、波浪动画、路由框架等源码...
  • JS题目及答案整理
  • Mac转Windows的拯救指南
  • node学习系列之简单文件上传
  • Python_网络编程
  • TypeScript迭代器
  • ucore操作系统实验笔记 - 重新理解中断
  • vue-loader 源码解析系列之 selector
  • 从零开始的无人驾驶 1
  • 动态规划入门(以爬楼梯为例)
  • 搞机器学习要哪些技能
  • 技术攻略】php设计模式(一):简介及创建型模式
  • 前端每日实战 2018 年 7 月份项目汇总(共 29 个项目)
  • Hibernate主键生成策略及选择
  • 微龛半导体获数千万Pre-A轮融资,投资方为国中创投 ...
  • ​LeetCode解法汇总307. 区域和检索 - 数组可修改
  • ​总结MySQL 的一些知识点:MySQL 选择数据库​
  • # .NET Framework中使用命名管道进行进程间通信
  • #QT(串口助手-界面)
  • #每日一题合集#牛客JZ23-JZ33
  • #免费 苹果M系芯片Macbook电脑MacOS使用Bash脚本写入(读写)NTFS硬盘教程
  • %check_box% in rails :coditions={:has_many , :through}
  • (2/2) 为了理解 UWP 的启动流程,我从零开始创建了一个 UWP 程序
  • (ctrl.obj) : error LNK2038: 检测到“RuntimeLibrary”的不匹配项: 值“MDd_DynamicDebug”不匹配值“
  • (笔记)Kotlin——Android封装ViewBinding之二 优化
  • (博弈 sg入门)kiki's game -- hdu -- 2147
  • (补充)IDEA项目结构
  • (附源码)ssm基于jsp高校选课系统 毕业设计 291627
  • (每日持续更新)jdk api之FileReader基础、应用、实战
  • (四)鸿鹄云架构一服务注册中心
  • (五)c52学习之旅-静态数码管
  • (转)linux下的时间函数使用
  • .NET CLR基本术语
  • .NET CORE 3.1 集成JWT鉴权和授权2
  • .net开源工作流引擎ccflow表单数据返回值Pop分组模式和表格模式对比
  • @ 代码随想录算法训练营第8周(C语言)|Day53(动态规划)
  • @javax.ws.rs Webservice注解
  • @SuppressWarnings注解