zoukankan      html  css  js  c++  java
  • priority_queue

    priority_queue

    priority_queue就是一个堆,并且默认情况下位大根堆。

    priority_queue函数列表
    函数 描述      by MoreWindows( http://blog.csdn.net/MoreWindows )
    构造析构  
    priority_queue <Elem> c  创建一个空的queue 。
    注:priority_queue构造函数有7个版本,请查阅MSDN
    数据访问与增减  
    c.top() 返回队列头部数据
    c.push(elem) 在队列尾部增加elem数据
     c.pop() 队列头部数据出队
    其它操作  
    c.empty() 判断队列是否为空
    c.size()

    返回队列中数据的个数

       

    可以看出priority_queue的函数列表与栈stack的函数列表是相同的。

    priority_queue优先队列,插入进去的元素都会从大到小排好序

    PS:在priority_queue<ll, vector<ll>, greater<ll> > pq;中
    第一个参数为数据类型,第二个参数为保存数据的容器(默认为vector<int>),第三个参数为元素比较函数(默认为less)。

    STL里面默认用的是 vector. 比较方式默认用 operator< , 所以如果你把后面俩个参数缺省的话,
    优先队列就是大顶堆,队头元素最大。

    更多细节看实例吧:

     1 #include <bits/stdc++.h>
     2 using namespace std;
     3 priority_queue<int> q1;
     4 priority_queue<int,vector<int>,greater<int> > q2;
     5 priority_queue<int,vector<int>,less<int> > q3;//默认为less,是大根堆 
     6 
     7 struct node{ 
     8     int a; 
     9     int b;
    10     node(int a,int b){
    11         this->a=a;
    12         this->b=b;
    13     }
    14 }; 
    15 struct myCmp{
    16     bool operator ()(const node &p1,const node &p2){//这里是取引用 ,而且这里重载的是括号而不是<号 
    17         return p1.a<p2.a;
    18     }
    19 };
    20 
    21 priority_queue<node,vector<node>,myCmp > q4;
    22 
    23 int main(){
    24     int a[7]={1,9,5,7,8,11,4};
    25     
    26     for(int i=0;i<7;i++) q1.push(a[i]);
    27     cout<<q1.top()<<endl;//输出为11,所以默认为大根堆
    28     
    29     for(int i=0;i<7;i++) q2.push(a[i]);
    30     cout<<q2.top()<<endl;//输出为1,说明greater加持之后变成了小根堆    
    31 
    32     for(int i=0;i<7;i++) q3.push(a[i]);
    33     cout<<q3.top()<<endl;//输出为11,说明是大根堆,默认就为less        
    34     
    35     int h[3][2]={{1,3},{3,2},{2,1}}; 
    36     for(int i=0;i<3;i++) {
    37         int a=h[i][0];
    38         int b=h[i][1];
    39         q4.push(node(a,b));
    40     }
    41     node p=q4.top();
    42     cout<<p.a<<" "<<p.b<<endl;//输出为3 2,说明是按a成员来的大根堆,我定义的时候是定义的小于,也就是相当于less 
    43     
    44     return 0;
    45 } 

     关于代码说几点:

    1、构造函数

    2、重载()

    3、满足比较条件的元素往后走了

    4、比较部分要是结构体

  • 相关阅读:
    C++字符串转数字,数字转字符串
    [转]基础知识整理
    POJ 3071 Football
    POJ 3744 Scout YYF I
    2013成都Regional:一块木板,几个气球
    HDOJ 4497 GCD and LCM
    POJ 1185 炮兵阵地
    POJ 2031 Building a Space Station
    HDOJ 4717 The Moving Points
    CSU 1328: 近似回文词
  • 原文地址:https://www.cnblogs.com/Renyi-Fan/p/7512964.html
Copyright © 2011-2022 走看看