首先先讲一下仿函数

仿函数

仿函数(functor),就是使一个类的使用看上去像一个函数。其实现就是类中实现一个operator(),这个类就有了类似函数的行为,就是一个仿函数类了。仿函数的主要功能是为了搭配STL算法使用,单独使用仿函数的情况比较少。 (感谢百度百科)

可能你看了以后也还是不太明白它到底是干什么的,怎么作用的,那么我就来简单讲一下

仿函数就是带有一个或多个重载小括号的成员函数的一个结构体或类,又叫做仿函数类

仿函数类既可以当函数用,又可以当结构体用,好处是这样就可以通过传递模板类来给STL传递一个你写的函数

如下

#include <bits/stdc++.h>
using namespace std;
struct disp{void operator()(int x){cout<<x<<endl;}
};
int main(){disp()(2);return 0;
}

实现了一个输出 int x 的函数功能

对于传递模板类就要说到今天的正题了--优先队列--priority_queue

优先队列,本质不是队列,而是堆,且默认大根(顶)堆

声明定义:priority_queue <T,Container,Compare>

T是数据类型

Container是underlying container,底层容器,用来作为优先队列的内部实现

Compare是数据排列方式的比较,需要传入仿函数类

需要注意的点有如下几条:

①当T类型拥有小于号的比较功能时,Container和Compare可省略,默认为vector和less

②Container不是随意一个都可以,必须是有迭代器减法功能的容器才行

(看了优先队列内部代码后,发现功能的实现过程中有迭代器减法)

这类容器一般都是内存地址连续(迭代器连续),一般可由下标访问

博主已知的有 deque,vector,array

其中array内存大小需要设置,并非无限,所以不常用

对于deque和vector用于priority_queue的区别

博主可以负责任的告诉你:没有区别!priority_queue内部的实现不涉及二者差异的部分

并且priority_queue带给用户的接口也很狭窄,不涉及deque和vector的功能

③T类型如果是你自定义的结构体或类,例如node

那么下面说的是必须的

你要么node里重载小于号,要么写一个仿函数类

less<node>这种东西可没有

优先队列的声明与定义:

#pragma GCC optimize("Ofast")
#include <bits/stdc++.h>
using namespace std;
struct node{int x;bool operator<(node a)const{return x<a.x;}
};
struct node2{int x;friend bool operator<(node2 a,node2 b){return a.x<b.x;}
};
struct cmp{bool operator()(int a,int b){return a<b;}
};
int main(){priority_queue<int> q0;priority_queue<int,vector<int>,less<int>> q1;priority_queue<int,deque<int>,less<int>> q2;priority_queue<int,array<int,100>,less<int>> q3;priority_queue<int,vector<int>,cmp> q4;priority_queue<node> q5;priority_queue<node2> q6;return 0;
}

以上所有写法全是大根堆(top大),小根同理

然后注意!node里那个成员函数必须写const!!!

常成员函数与非常成员函数是不同的函数,内部实现用的是常成员函数!

友元函数的话就不需要担心这个了,常还是非常只有成员函数有

再就是 如果写 const node &的话会快很多,遇到卡时间的题会很有效,但是写或不写都不会涉及编译bug

常成员函数的那个const一定不能缺!不能缺!

然后总有人会问,为啥less大根,来看下less和greater的内部代码

/// One of the @link comparison_functors comparison functors@endlink.template<typename _Tp>struct less : public binary_function<_Tp, _Tp, bool>{booloperator()(const _Tp& __x, const _Tp& __y) const{ return __x < __y; }};/// One of the @link comparison_functors comparison functors@endlink.template<typename _Tp>struct greater : public binary_function<_Tp, _Tp, bool>{booloperator()(const _Tp& __x, const _Tp& __y) const{ return __x > __y; }};

怎么说呢,举个例子吧

比方说 a[5]={3,1,5,4,2};

sort(a,a+5,less<int>());

结果就是:1,2,3,4,5

对于队列,queue也好,deque也好

下标小的是front(迭代器begin),下标大的是back(迭代器end)

对于priority_queue,top不是front,而是back,所以这东西和队列没啥关系,鬼知道名字怎么起的

类似于stack,是在后端操作的

priority_queue按less从小到大排的话,后端就是大的,于是就是大根堆

讲了这么多大家大概已经彻底理解这个这个priority_queue是啥,大概如何实现的吧

最后就该讲最简单的部分了

一些操作(成员函数):

priority_queue<int> q;
q.push(x);//压入堆顶
q.emplace(x);//压入堆顶
q.empty();//是否空
q.size();//个数
q.swap(q2);//交换
q.top();//堆顶元素的引用

好,大概就这些,我觉得算是挺详细的了,应该能对大家学习有很大帮助

C++STL之优先队列相关推荐

  1. STL优先队列实现堆(模板 附力扣题目)

    讲解视频:https://www.bilibili.com/video/BV12i4y1f7ky/ 堆的本质 堆是一种特殊的完全二叉树.每一个节点的值都大于等于或者小于等于其孩子节点的值. 堆的操作时 ...

  2. hdu1285 拓扑排序+优先队列

    原题地址 这算是我个人AC的第一个拓扑排序题目吧. 题目解读 给出几组比赛的胜负情况.推断最后的排名.依据题意这就是一个明显的拓扑排序问题了. 注意 假设由于可能的排名有多种情况,这时要保证编号小的在 ...

  3. 275.算法设计工具―STL

    1.概述 1.1定义 STL主要由container(容器).algorithm(算法)和iterator(迭代器)三大部分构成,容器用于存放数据对象(元素),算法用于操作容器中的数据对象. 1.2s ...

  4. 《算竞(紫书)》笔记1 STL入门

    <算竞(紫书)>笔记1 STL入门 16340040 SDCS 目录 算竞紫书笔记1 STL入门 某些抢开头的废话 STL 1 排序 2 不定长数组vector 3 集合set 4 映射m ...

  5. [转载]STL之priority_queue

    原文地址:STL之priority_queue作者:李大宝 STL之优先队列 原本以为priority_queue很简单,才知道原来懂的只是最简单的形式. 头文件:#include<queue& ...

  6. [转载]STL之priority_queue_彭世瑜_新浪博客

    原文地址:STL之priority_queue作者:李大宝 STL之优先队列 原本以为priority_queue很简单,才知道原来懂的只是最简单的形式. 头文件:#include<queue& ...

  7. BFS【古希腊之争(二)】(bfs+优先队列)

    题目描述 话说,年轻的斯巴达勇士们终于走出迷宫,取得胜利并顺利赶了回来.可是等他们回到斯巴达的时候才发现,雅典人趁他们不在偷袭了城邦,并抓走了他们的爱人.侥幸逃出来的几个人说,她们被关押在一个迷宫的牢 ...

  8. 1369:合并果子(fruit)——优先队列

    [题目描述] 在一个果园里,多多已经将所有的果子打了下来,而且按果子的不同种类分成了不同的堆.多多决定把所有的果子合成一堆. 每一次合并,多多可以把两堆果子合并到一起,消耗的体力等于两堆果子的重量之和 ...

  9. C++标准模板库(STL)笔记与示例

    C++标准模板库知识点: /*一.主要内容: sort //必会! next_permutation() //记住怎么调用 list // stack //调用类库 queue //调用类库 vect ...

最新文章

  1. Mysql备份还原数据库之mysqldump实例及参数详细说明
  2. js webpack 配置路径_webpack中如何设置html引入js的路径
  3. LESSON 11.4 原理进阶:AdaBoost算法流程详解
  4. 如何使用soapUI模拟webservice客户端发送请求
  5. Commit request failed Commit failed. Ref must be HEAD and is HEAD
  6. 命令行分析java线程CPU占用
  7. H.264中POC类型之探讨
  8. c++ 模拟拖动_2020电工(中级)模拟考试题及电工(中级)模拟考试题库
  9. python实现Queue和Stack
  10. java连接Oracle和PostGreSQL
  11. 正则表达式及grep
  12. intellji External Libraries下依赖包找不到解决方法
  13. Node.js 中 exports 和 module.exports 的区别
  14. XML的注释踩坑记录
  15. 计算机多系统启动光盘制作,制作启动光盘,详细教您如何制作光盘启动盘
  16. IIS6配置和PHP5.6环境安装
  17. 大学几年一直在“半瓶哐镗”的我
  18. 闽江学院计算机毕设,闽江学院软件学院关于2017届毕业论文答辩有关事项的通知...
  19. 国内主流新一代用户行为分析系统选型过程分享
  20. 电子计算机猜一生肖,辰所对应的生肖是什么

热门文章

  1. 二十三种设计模式[6] - 适配器模式(Adapter Pattern)
  2. LIS (nlogn)的算法
  3. QT次线程连接数据库
  4. 低级问题---.net franmework安装
  5. 成为大数据工程师需要哪些技能?(一文秒懂大数据)
  6. 【开200数组解决二叉搜索树的建立、遍历】PAT-L3-016. 二叉搜索树的结构——不用链表来搞定二叉搜索树...
  7. 数据结构 顺序串笔记
  8. AngularJs -- 模 块
  9. linux下用mail发送邮件
  10. git笔记之解决eclipse不能提交jar等文件的问题