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

深度探索list

1.list的基本组成

list是一个双向链表,它的基本组成就是

成员作用
prev指针指向上一个元素
next指针指向下一个元素
data用来保存数据

在这里插入图片描述

2.list的迭代器

由于人们一般习惯于:迭代器++是找到下一个元素,迭代器–是找到上一个元素。在双向链表list中,我们可以知道下一个元素就是next所指元素,上一个元素就是prev所指元素。
如果我们想要实现迭代器++的操作,就需要访问list节点对应的next指针。所以迭代器是一个类,需要为我们封装这些操作,或者更准确的说,迭代器类是一个智能指针

list的插入和接合操作都不会造成原有的list迭代器失效,对于删除操作,也只有”指向被删除元素“的那个迭代器失效,其它迭代器不受任何影响

1.++i 和 i++的重载

Q:在C++中,由于++i和i++都只有一个参数,那么如何对这两种分别进行重载呢?
A:在C++中,规定了带有参数的是后置++,没有参数的是前置++。比如说
operator++(int) {}; //对 i++ 进行重载
operator++() {};    //对 ++i 进行重载

注意

1.后置++的* 操作符不是解引用,而是调用了拷贝构造函数来制造一个副本
2.为了模拟C++的整数不能进行如下操作:

(i++)++;    //不允许
i++++;     //不允许
(++i)++;    //允许
++++i;      //允许

C++允许前置++连续,但是不允许后置++连续,所以迭代器中,对于前置++,返回的是引用。而后置++运算符返回的不是reference,而是值;
在这里插入图片描述

3.G4.9的list

1.G4.9对比G2.9的一些细节修正

1.list中指针的类型不再是void*
2.代器不再需要传一种类型的三个形式(T,* T,& T),而是传入T之后再typedef。
在这里插入图片描述

2.G4.9的list更加复杂

在这里插入图片描述

迭代器补充

1.迭代器的设计原则

迭代器是算法和容器之间的桥梁,所以算法会想知道迭代器的一些性质来辅助算法。
这些性质如下:

五种迭代器中必须typedef的性质解释
iteratior_category迭代器类型
value_type迭代器所指对象的类型
difference_type两个相邻的迭代器之间的距离
pointer指向value type的指针
reference对value type的引用

在这里插入图片描述

2.iterator traits的作用和设计

1.作用

由于上面的设计原则可以知道,迭代器必须typedef五个性质。但是如果这个指针不是一个class的指针,而就是一个普通的指针的话,这样的话,我们怎么分辨呢?iterator traits就用上了。

在这里插入图片描述

2.设计

设计一个中间层作在迭代器和算法中间作为媒介,这个中间层就是iterator traits

实际上就是利用了C++中模板的偏特化来进行一个区分。

注意即使是const指针,为了它能够创建一个非const变量,我们也应当返回一个非const的类型。

图1这里仅仅是举例,完整在图2
在这里插入图片描述
在这里插入图片描述

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

相关文章:

  • QQuick-自绘
  • 【算法】【算法杂谈】已知[1,m]的等概率函数,求[1,n]的等概率函数
  • 【Python】Python中的列表,元组,字典
  • 分布式系统概念和设计-分布式对象和远程调用
  • 11-FastDFS
  • Word这样用,提高效率不加班
  • 【Linux】调试器---gdb的使用
  • MySQL数据库之表的增删改查(进阶)
  • Nginx从开始到结束,简单到小白都能懂哦
  • Qt——Qt控件之按钮-QDialogButtonBox对话框按钮盒子控件的使用总结(例程:自定义按钮)
  • 数据库学习-常用的SQL语句
  • 5种获取JavaScript时间戳函数的方法
  • 图的宽度优先遍历
  • 企业AD域(域控服务器)的安装和配置详细教程
  • 面试官:一千万的数据,你是怎么查询的?
  • IntelliJ 上 Azure Event Hubs 全新支持来了!
  • 性能测试,监控磁盘读写iostat
  • steam游戏搬砖项目怎么做?月入过万的steam搬砖项目教程拆解
  • 协同运力、算力、存力,加速迈向智能世界
  • 被裁员了,要求公司足额补缴全部公积金,一次补了二十多万!网友兴奋了,该怎么操作?...
  • 家庭智能插座一Homekit智能
  • 什么是雪花算法?啥原理?
  • 【华为OD机试真题】 统计差异值大于相似值二元组个数(javapython)
  • 【cmake篇】选择编译器及设置编译参数
  • MySQL having关键字详解、与where的区别
  • CSS中相对定位与绝对定位的区别及作用
  • 7.1 基本运放电路(1)
  • 交友项目【首页推荐,今日佳人,佳人信息】
  • kafka-5 kafka的高吞吐量和高可用性
  • Jmeter前置处理器和后置处理器