模板建站配云服务器施工,石河子网站制作,宁波房产网上备案查询,大专上电子商务能干什么头文件#include queue 优先队列具有队列的所有特性#xff0c;本质是一个堆实现的#xff0c;和队列基本操作相同: top 访问队头元素 empty 队列是否为空 size 返回队列内元素个数 push 插入元素到队尾 (并排序) emplace 原地构造一个元素并插入队列 pop 弹出队头元素…头文件#include queue 优先队列具有队列的所有特性本质是一个堆实现的和队列基本操作相同: top 访问队头元素 empty 队列是否为空 size 返回队列内元素个数 push 插入元素到队尾 (并排序) emplace 原地构造一个元素并插入队列 pop 弹出队头元素 swap 交换内容
和队列不一样的是优先队列没有 front() 函数与 back() 函数而只能通过 top() 函数来访问队首元素也可以称为堆顶元素也就是优先级最高的元素。
定义方式有两种
typename 可以是任意基本数据类型或容器
priority_queue typename name;定义priority_queueType, Container, Functional Type 数据类型Container 容器类型Container必须是用数组实现的容器比如vector,deque等等但不能用 list。STL里面默认用的是vectorFunctional 就是比较的方式当需要用自定义的数据类型时才需要传入这三个参数使用基本数据类型时只需要传入数据类型默认是大顶堆。 注意第二个参数填写的是来承载底层数据结构堆heap的容器如果第一个参数是 double 型或 char 型则此处只需要填写 vector 或 vector 而第三个参数 则是对第一个参数的比较类less 表示数字大的优先级越大而 greater 表示数字小的优先级越大。也可以自定义数据比较关系
对基本数据类型来说下面两种优先队列的定义是等价的以 int 型为例注意最后两个 之间有一个空格
priority_queueint q;
priority_queueint,vectorint,lessint q;如果想让优先队列总是把最小的元素放在队首则需进行如下定义
priority_queueint,vectorint,greaterintq;如果不是基本类型那么结构体的优先级设置方法有所区别需要重载小于号 例如
struct student
{string name;int age;friend bool operator (student s1,student s2){return student.age student.age;}
};重载大于号会编译错误因为从数学上来说只需要重载小于号即 f1 f2 等价于判断 f2 f1而 f1 f2 则等价于判断!(f1f2) !(f2fl))
如果想把重载写在变量结构体外面则需要重载小括号同时将其用struct包装起来例如
struct ListNode {int val;ListNode *next;ListNode() : val(0), next(nullptr) {}ListNode(int x) : val(x), next(nullptr) {}ListNode(int x, ListNode *next) : val(x), next(next) {}
}
struct comp{bool operator() (ListNode *L1,ListNode *L2){return L1-val L2-val;}
};
priority_queueListNode*,vectorListNode*,comp q;