文章目录
优先级队列本身并没有迭代器,和栈和队列的原因是一样的。
仿函数
这个类可以像函数一样使用
那这个类有什么意义呢?
库里把这个类加上了类模板使得能比较的类型范围扩大,支持更多类型的比较,只要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->()有涉及了一个->的省略,但总的来说原生指针和反向迭代器不冲突