priority_queue - coming soon

文章讨论了仿函数在C++中的作用,特别是作为比较对象用于控制堆和排序的顺序。仿函数提供了更灵活的比较方式,允许自定义比较规则。同时,文章解释了反向迭代器的设计原理,它是如何通过正向迭代器适配各种容器并实现反向遍历。文章还提到,反向迭代器在处理原生指针时不会存在问题,因为它支持->操作符。
摘要由CSDN通过智能技术生成


优先级队列本身并没有迭代器,和栈和队列的原因是一样的。

仿函数

在这里插入图片描述
这个类可以像函数一样使用
那这个类有什么意义呢?
在这里插入图片描述

库里把这个类加上了类模板使得能比较的类型范围扩大,支持更多类型的比较,只要T类型支持比较重载。

那我这两个类型比较我直接比较就可以了啊?为什么用这个仿函数呢?
答:
直接比较写死了小于或者大于
在这里插入图片描述
利用仿函数就不再是写死的,而通过仿函数对象com可以实现大小堆
仿函数是另一维度的泛型,存储的是比较的类型,我也不知道你传入的是什么比较,这里可以实现<,>的比较,控制大堆小堆
在这里插入图片描述

仿函数 的作用和 函数指针本质是一样的,只不过函数指针更加复杂
仿函数的意义(本质)是:这个类的对象可以像函数一样使用,用库里面的less,greater控制大堆小堆 , 如果类型的比较不符合 我们的意愿,可以按照我们自己的意愿控制比较规则
用它替代C语言的函数指针
作用:控制库里面的大堆小堆
sort排序 升序降序

必须得自己写仿函数的场景

在这里插入图片描述

保存的是对象的指针,这很正常,默认less great是按照内置类型比较大小,而指针大小是随机的,所以这里比较结果都在根据指针大小发生变化
在这里插入图片描述
而且内置类型指针(Date*)无法重载运算符,只能用仿函数
有了LessPDate你传入的是指针,当我不按照指针比,而是解引用利用Date的比较重载,
这也是需要日期类重写了比较函数的支持,如果没有还真得写,如果不写还可以直接通过仿函数自己比较,但是这种方式不推荐,还是提供比较支持把。
在这里插入图片描述

反向迭代器

STL库里面设计的反向迭代器有它自己的考虑,它设计的是针对所有容器,你给我一个容器的正向迭代器我就能适配出它的反向迭代器,而不是只针对某一个容器单独设计反向迭代器
在这里插入图片描述

反向迭代器如何设计的?
一般会想到是这样:
在这里插入图片描述
但其实库里面是这样:
主打的就是和正向迭代器对称-反向
在这里插入图片描述

在这里插入图片描述
再看看库里面的反向迭代器实现:
++变–
–变++ 反向吗,这很正常
–tmp --优先级高于 *
为什么operator
()里面这么设计?
因为一开始rbegin指向一个随机值,*–tmp解引用出来的是前一个,这样遍历就正常遍历了
在这里插入图片描述

在这里插入图片描述

来看看我们自己设计的反向迭代器:
思路和库里面一样,给一个正向的适配出反向的。
operator*()的返回值是T,可是模板没有T,只能直接传参或者萃取(不建议)
在这里插入图片描述
不仅可以适配List的,来看看vector的,甚至是树的都可以适配出来
在这里插入图片描述

问题:那么这个反向迭代器在适配原生指针时(int*)会不会有什么问题?比如operator–>( )时会不会有什么问题?
答:没什么问题,原生指针具有->的功能,这里反向迭代器也肯定要有这个功能函数
如果是int* 调用了operator->() 那么返回的还是int*,int*又不是结构体指针->没成员变量可以指向
这个operator->()有涉及了一个->的省略,但总的来说原生指针和反向迭代器不冲突

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值