c++ STL 优先队列

前言:建议初学者跟着把每一个样例打一遍,并自己改变代码做到更多不同的效果。

优先队列是什么,干嘛用的

优先队列,即带有优先级的队列。不懂啥是队列的可以先去学队列了(先进先出的就是队列)。那么带有优先级,就是可以做到排序的队列,比如我依次放入2,1,3,小顶堆优先队列就可以通过1,2,3的顺序把他们吐出来。而一般的队列只能以2,1,3的顺序把他们吐出来。

作用:以最短路和BFS为例,就经常使用优先队列。当然其他问题和算法也经常使用优先队列。

要学些什么

学习优先队列的基础用法前,你可以啥也没学,只会用法就行。但是要想知道优先队列的原理,实现优先队列的自定义,建议至少把二叉树,堆排序给学了,最好把C++的类也学了。这里不会讲优先队列的原理,而是注重使用方法。这东西学会怎么用比学会原理的时间要早太多了。

如果代码看着眼花,那就跟着打一次,边打边尝试理解它的意思。

一定要上手实践


优先队列的定义:

priority_queue

Type 是数据类型;Container 是容器类型,一般使用vector;Functional 是比较的方式。

优先队列的基本操作:

  • top 访问队头元素

  • empty 队列是否为空

  • size 返回队列内元素个数

  • push 插入元素到队尾并排序

  • emplace 原地构造一个元素并插入队列

  • pop 弹出队头元素

  • swap 交换内容


基础使用

学会使用这部分前你不需要懂它到底啥原理。

注:

大顶堆:字面意思,根(顶)最大的堆。

小顶堆:根(顶)最小的堆。

#include
#include
#include
#include
using namespace std;

//_________________默认为大顶堆_________________
priority_queue q1;


//_________________标准一般写法_________________
//小顶堆
priority_queue,greater > q2;
//大顶堆
priority_queue,less >q3;
priority_queue, greater >q4;

int main()
{
    //测试样例1,默认情况
    q1.push(2);
    q1.push(1);
    q1.push(4);
    cout<<"q1:";
    while(!q1.empty()){
        cout<

进阶使用

在学习这部分前,你可以不学前置知识,但顶多只能照猫画虎,建议现学上面提到的前置知识,再来学就很好懂了。

 进阶1:pair

#include
#include
#include
#include
using namespace std;

//_____________piar_________________
//标准写法
priority_queue,vector >,greater > >q1;
//当然也可以简写,不过默认大顶堆
priority_queue >q2;

int main()
{
    //测试样例1:
    pair a(1,"issey");
    pair b(1,"aaa");
    pair c(2,"zz");
    q1.push(a);
    q1.push(b);
    q1.push(c);
    cout<<"q1:"< A(1,1);
    pair B(1,2);
    pair C(2,0);
    q2.push(A);
    q2.push(B);
    q2.push(C);
    cout<<"q2:"<

进阶2:自定义优先队列

#include
#include
#include
#include
using namespace std;

//__________方法1:在结构体里重载运算符________
typedef struct Node{
    int sum,id;
    friend bool operator<(Node a,Node b){
        return a.sum>b.sum;//通过属性sum建立小顶堆
    }
}Node;
priority_queue q1;
/*
    关于结构体重载运算符和优先队列定义的解释:
        priority_queue q1是默认定义方式,我们知道默认的应该是大顶堆,堆排序构建大顶
    堆时,应该是当前节点小于(左、右)孩子,才进行交换,所以默认的运算符是'<',所以在结构体
    重载运算符时,应该是friend bool operator<(Node a,Node b)。
        而我们想实现通过sum建立小顶堆,所以重载'<'时,把真正的比较对象置为'>','>'是构建小顶
    堆,所以使用默认方式建立优先队列,本来要读'<',实际上读的是'>',就简化了书写。(笑,这种方
    法太坏蛋了)
*/


//_________________方法2:重写仿函数__________________
typedef struct Node2{
    int id,sum;
}Node2;

struct cmp{
    bool operator()(const Node2 a,const Node2 b){
        return a.sum,cmp >q2;


int main()
{
    //测试样例1
    Node a,b,c;
    a.id = 1;a.sum = 10;
    b.id = 2;b.sum = 3;
    c.id = 3;c.sum = 6;
    q1.push(a);
    q1.push(b);
    q1.push(c);
    cout<<"q1:"<

你可能感兴趣的:(ACM学习,acm竞赛,数据结构)