优先队列priority_queue

转载 2018年04月15日 12:42:37

priority_queue

  priority_queue 优先队列,其底层是用堆来实现的。在优先队列中,队首元素一定是当前队列中优先级最高的那一个。

  在优先队列中,没有 front() 函数与 back() 函数,而只能通过 top() 函数来访问队首元素(也可称为堆顶元素),也就是优先级最高的元素。

一、基本数据类型的优先级设置

  1. 此处指的基本数据类型就是 int 型,double 型,char 型等可以直接使用的数据类型,优先队列对他们的优先级设置一般是数字大的优先级高,因此队首元素就是优先队列内元素最大的那个(如果是 char 型,则是字典序最大的)。

    //下面两种优先队列的定义是等价的
    priority_queue<int> q;
    priority_queue<int,vector<int>,less<int> >;//后面有一个空格
  • 1
  • 2
  • 3
  • 4
  • 5

  其中第二个参数( vector ),是来承载底层数据结构堆的容器,第三个参数( less ),则是一个比较类,less 表示数字大的优先级高,而 greater 表示数字小的优先级高

如果想让优先队列总是把最小的元素放在队首,只需进行如下的定义:


    priority_queue<int,vector<int>,greater<int> >q;
  • 1
  • 2
  • 3

示例代码:


    void test1(){
        //默认情况下,数值大的在队首位置(降序)
        priority_queue<int> q;
        for(int i  = 0;i <= 10;i ++)
            q.push(i);
        while(!q.empty()){
            cout<<q.top()<<" ";
            q.pop();
        }
        cout<<endl;

        //greater<int>表示数值小的优先级越大
        priority_queue<int,vector<int>,greater<int> > Q;
        for(int i  = 0;i <= 10;i ++)
            Q.push(i);
        while(!Q.empty()){
            cout<<Q.top()<<" ";
            Q.pop();
        }

    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23

二、结构体的优先级设置

1.方式一:重载运算符 ‘<’

  可以在结构体内部重载 ‘<’,改变小于号的功能(例如把他重载为大于号)


    struct student{
        int grade;
        string name;

        //重载运算符,grade 值高的优先级大
        friend operator < (student s1,student s2){
            return s1.grade < s2.grade;
        }
    };
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

示例代码:


    void test2(){
        priority_queue<student> q;
        student s1,s2,s3;
        s1.grade = 90;
        s1.name = "Tom";

        s2.grade = 80;
        s2.name = "Jerry";

        s3.grade = 100;
        s3.name = "Kevin";

        q.push(s1);
        q.push(s2);
        q.push(s3);

        while(!q.empty()){
            cout<<q.top().name<<":"<<q.top().grade<<endl;
            q.pop();
        } 

    }
        /*
         结果:
            Kevin:100
            Tom:90
            Jerry:80
        */
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30

2.方式二:把重载的函数写在结构体外面

  将比较函数写在结构体外面,作为参数传给优先队列。


    struct fruit{
        string name;
        int price;
    };
    struct cmp{
        // "<" 表示 price 大的优先级高
        bool operator() (fruit f1,fruit f2){
            return f1.price < f2.price;
        }
    };
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

示例代码:


    void test3(){
        priority_queue<fruit,vector<fruit>,cmp> q;
        fruit f1,f2,f3;

        f1.name = "apple";
        f1.price = 5;

        f2.name = "banana";
        f2.price = 6;

        f3.name = "pear";
        f3.price = 7;

        q.push(f1);
        q.push(f2);
        q.push(f3);

        while(!q.empty()){
            cout<<q.top().name<<":"<<q.top().price<<endl;
            q.pop();
        }
    }

    /*
     结果:
           pear:7
           banana:6
           apple:5
    */

STL 之 优先队列(priority_queue)

1、什么是优先队列        能够完成下列两种操作的数据结构,我们便称之为优先队列。        ①插入一个数值    ②取出最大(或者最小)的数值(获取数值,并且删除)。        从严格...
  • luomingjun12315
  • luomingjun12315
  • 2015-08-10 06:48:29
  • 4664

优先队列priority_queue的使用方法

以下内容摘自http://blog.csdn.net/morewindows/article/details/6976468 priority_queue 优先级队列是一个拥有权值概念的单向...
  • Kiritow
  • Kiritow
  • 2016-05-19 10:33:09
  • 735

ACM向:关于优先队列priority_queue自定义比较函数用法整理

关于优先队列priority_queue自定义比较函数用法整理 原来上不了网,写在word里了,代码什么的直接贴过来了,有空整理成高亮的形式。 0.0、首先注意一点,priority_queue没...
  • bat67
  • bat67
  • 2017-08-25 19:21:08
  • 1173

C++ 优先队列 priority_queue 的基本使用方法【定义优先级】

转自: #include #include using namespace std; priority_queue big; //大根堆 priority_queue,grea...
  • baidu_35643793
  • baidu_35643793
  • 2017-04-14 16:43:17
  • 758

【原创】优先队列priority_queue详解

优先队列一、 引入优先队列是一种特殊的队列,在学习堆排序的时候就有所了解,点“击”查看。那么优先队列是什么呢? 说白了,就是一种功能强大的队列。如果不太清楚队列,可以看看我这篇博客。它的功能强大在哪...
  • c20182030
  • c20182030
  • 2017-04-25 17:50:01
  • 10638

C++ priority_queue 与 lambda的结合使用

1.priority_queue定义template class priority_queue;按着这个模板定义来看,需要给出每一个模板参数的类型,来实例化模板。 默认使用的是小于操作的比较运算符...
  • liu2012huan
  • liu2012huan
  • 2016-10-26 11:27:37
  • 598

stack && queue && priority_queue 使用方法 (栈, 队列, 优先队列)

/** 贴下堆栈,优先队列的使用,竞赛中优先队列常会用到,前面两个 也经常用,但效率低,一般自己用数组写 */ #include #include using namespac...
  • zcube
  • zcube
  • 2015-09-05 10:08:33
  • 733

优先队列与set区别

1、优先队列 优先队列是不同于先进先出队列的另外一种队列,他每次从对列中取出的是具有最高优先级的元素; 优先队列有最小优先队列和最大优先队列。 2、C++ STL中的优先队列 (1)最...
  • chenchong_219
  • chenchong_219
  • 2014-12-21 10:55:37
  • 1587

优先级队列priority_queue之比较函数

STL默认的比较函数 greater是升序排列,后面的大于前面的 less是降序排列,后面的小于前面的 在初始化优先级队列时默认是less priority_queue,less > que与...
  • u014644714
  • u014644714
  • 2017-03-31 14:40:50
  • 1772

优先队列priority_queue基本操作

队列我们都知道,是一种先进后出的数据结构。 而优先队列是把队列内部的数据,按照一定的优先级排序后,再输出。 值得注意的是,优先队列没有front和back,只有top一种输出方式,这一点很像栈。 ...
  • qq_32680617
  • qq_32680617
  • 2016-03-10 21:29:31
  • 1265
收藏助手
不良信息举报
您举报文章:优先队列priority_queue
举报原因:
原因补充:

(最多只允许输入30个字)