大家好,我是苏貝,本篇博客带大家了解C++的string类的priority_queue优先队列,如果你觉得我写的还不错的话,可以给我一个赞👍吗,感谢❤️
目录
- 1. 介绍
- 2. 仿函数
- (A) 介绍
- (B) 控制比较逻辑
- 3. priority_queue和sort的模板参数
1. 介绍
优先级队列priority_queue的底层是堆,默认情况下,是大堆。我们也可以传仿函数来让priority_queue为小堆
下面是默认情况下的priority_queue,为大堆。
注意:只是取出来的数据是有序的,但是优先级队列容器内不有序(因为大堆/小堆只是逻辑结构是树,事实上一般是用数组存储的)
下面我们想试试让priority_queue为小堆,需要传仿函数
2. 仿函数
(A) 介绍
先用仿函数,内容后面讲
想用仿函数greate,需要包头文件algorithm,这样priority_queue就是小堆
仿函数,顾名思义,是与函数类似的东西。事实上,它是一个类,但是它的对象能像函数一样使用,所以这种类叫仿函数。为什么可以让它的对象像函数一样使用呢?因为在该类里重载了()。
仿函数可以用struct,也可以用class,如果用class就要将访问限定符设为public
上图显示的是有名对象调用运算符重载(),匿名对象也可以
为了让类Less也能对其它类型进行判断,将它写成类模板
(B) 控制比较逻辑
仿函数可以控制比较逻辑。
如下:我们想要将下图的v排序
- 按价格升序排
- 按价格降序排
- 按评价升序排
- 按评价降序排
这种时候,我们就可以通过使用不同的仿函数来实现对不同方面进行比较
按价格降序排
按评价升序排
按评价降序排
3. priority_queue和sort的模板参数
观察我们让priority_queue为小堆写的第三个模板参数:仿函数greater。再来看看sort模板的模板参数
下面是降序的一种写法,还可以直接传greater的匿名对象
对比sort和priority_queue,我们发现,priority_queue传的是greater类,而sort传的是greater类的对象,这是因为它们的底层实现不同
函数模板的参数应该是对象,类模板的参数应该是类型
好了,那么本篇博客就到此结束了,如果你觉得本篇博客对你有些帮助,可以给个大大的赞👍吗,感谢看到这里,我们下篇博客见❤️