zoukankan      html  css  js  c++  java
  • priority_queue

    转自:http://blog.csdn.net/sup_heaven/article/details/8036982

    priority_queue 优先级队列是一个拥有权值概念的单向队列queue,队列中,所有元素是按优先级排列的(也可以认为queue是个按进入队列的先后做为优先级的优先队列——先进入队列的元素优先权要高于后进入队列的元素)。

    在计算机操作系统中,优先级队列的使用是相当频繁的,进线程调度都会用到。

    在STL的具体实现中,priority_queue也是以别的容器作为底部结构,再根据堆的处理规则来调整元素之间的位置。

    模板声明:

    priority_queue<Type, Container, Functional>   //含三个参数
    

    Type 为数据类型,Container 为保存数据的容器,Functional 为元素比较方式

    默认Container:vector     //Container 必须是用数组实现的容器,比如 vector, deque ;不能用 list
    默认Functional:operator<
    所以若后面两个参数缺省的话,优先队列就是大顶堆

    priority_queue 函数列表

    priority_queue <Elem> c   //创建一个空的queue 。(注:priority_queue构造函数有7个版本)
    c.top()       //返回队列头部数据 
    c.push(elem)  //在队列尾部增加elem数据 
    c.pop()       //队列头部数据出队 
    c.empty()     //判断队列是否为空 
    c.size()      //返回队列中数据的个数 
    

    1. 大顶堆 - 默认

    #include <iostream>
    #include <queue>
    using namespace std;
    int main(){
        priority_queue<int, vector<int>, less<int> >q1;  //使用priority_queue<int> q1;一样
        for(int i=0; i<10; i++) 
    	q1.push(i);
        while(!q1.empty()){
            cout << q1.top() << endl;
            q1.pop();
        }
        return 0;
    }
    

    2. 小顶堆 – greater<>

    STL里面定义了一个仿函数 greater<>,对于基本类型可以用这个仿函数声明小顶堆

    #include <iostream>
    #include <queue>
    using namespace std;
    int main(){
        priority_queue<int, vector<int>, greater<int> >q2;
        for(int i=0; i<10; i++) 
    	q2.push(i);
        while(!q2.empty()){
            cout << q2.top() << endl;
            q2.pop();
        }
        return 0;
    }
    

    3. 自定义类型

    - 法一:重载 operator<

    自定义类型重载 operator< 后,声明对象时就可以只带一个模板参数.
    此时不能像基本类型这样声明 priority_queue<Node, vector<Node>, greater<Node> >;
    因为 greater<Node> 没有定义

    #include <iostream>
    #include <queue>
    using namespace std;
    struct Node{
        int x, y;
    }node;
    //重载>会编译出错,因为标准库默认使用元素类型的<操作符来确定它们之间的优先级关系
    bool operator<( Node a, Node b){
        if(a.x==b.x) return a.y>b.y;
        return a.x>b.x;
    }
    int main(){
        priority_queue<Node>q;
        for(int i=0;i<10;i++){
        	node.x=i;
        	node.y=10-i/2;
        	q.push(node);
        }	
        while(!q.empty()){
            cout << q.top().x << ' ' << q.top().y << endl;
            q.pop();
        }
        return 0;
    }
    
    - 法二:自己写仿函数 cmp

    仿函数(functor):使一个类的使用看上去像一个函数。其实现就是类中实现一个运算符函数operator()这个类有了类似函数的行为,就是一个仿函数类了.

    推广:set的自定义比较函数也可以写成这种形式

    #include <iostream>
    #include <queue>
    using namespace std;
    struct Node{
    	int x, y;
    }node;
    struct cmp{
        bool operator()(Node a,Node b){
            if(a.x==b.x) 
                return a.y>b.y;
            return a.x>b.x;
        }
    };
    int main(){
        priority_queue<Node, vector<Node>, cmp>q;
        for(int i=0; i<10; i++){
        	node.x=i;
        	node.y=10-i/2;
    	q.push(node);	
        }	
        while(!q.empty()){
            cout << q.top().x << ' ' << q.top().y << endl;
            q.pop();
        }
        return 0;
    }
    
  • 相关阅读:
    php面向对象方法
    php数组中元素的操作
    PHP数组的排序
    [设计模式]抽象工厂模式
    [设计模式]建造者模式
    [设计模式]工厂方法模式
    [设计模式]简单工厂模式
    [设计模式]单例模式
    设计模式系列
    JAVA 设计模式 状态模式
  • 原文地址:https://www.cnblogs.com/claremore/p/4814998.html
Copyright © 2011-2022 走看看