C++中的priority_queue

原创 2015年07月07日 12:35:26

STL中的priority_queue实现优先级队列。在优先级队列中,优先级高的元素先出队列。下面我们将介绍priority_queue的具体用法。

priority_queue的模板如下:

 template < class T, class Container = vector<T>,

           class Compare = less<typename Container::value_type> > class priority_queue; 

Where the template parameters have the following meanings:
T: Type of the elements.
Container: Type of the underlying container object used to store and access the elements.
Compare: Comparison class: A class such that the expression comp(a,b), where comp is an object of this class and a and b are elements of the container, returns true if a is to be placed earlier than b in a strict weak ordering operation. This can either be a class implementing a function call operator or a pointer to a function. This defaults to less<T>, which returns the same as applying the less-than operator (a<b).
The priority_queue object uses this expression when an element is inserted or removed from it (using push or pop, respectively) to grant that the element popped is always the greater in the priority queue.
 
对于第三个参数来说,只有三种情况。下面将分类阐述。
 

第一种,直接使用默认的。

它的模板声明带有三个参数,priority_queue<Type, Container, Functional>Type 为数据类型, Container 为保存数据的容器,Functional 为元素比较方式。Container 必须是用数组实现的容器,比如 vector, deque 但不能用 list.STL里面默认用的是 vector. 比较方式默认用 operator< , 所以如果你把后面俩个参数缺省的话,优先队列就是大顶堆,队头元素最大。例子如下:

    int len = 5, i = 0;
    int a[5] = {3,5,9,6,2};
 
    priority_queue<int> qi;
    for(i = 0; i < len; i++)
        qi.push(a[i]);
 
    for(i = 0; i < len; i++)
    {
        cout<<qi.top()<<" ";
        qi.pop();
    }

  通过<操作符可知在整数中元素大的优先级高。故例子中输出结果为:9 6 5 3 2
 
第二种:
 
在上述代码中,如果我们要把元素从小到大输出怎么办呢?这时我们可以传入一个比较函数,使用functional.h函数对象作为比较函数。
 
如果要用到小顶堆,则一般要把模板的三个参数都带进去。STL里面定义了一个仿函数 greater<>,对于基本类型可以用这个仿函数声明小顶堆
priority_queue<int, vector<int>, greater<int> > qi2;
对于自定义类型,则必须自己重载 operator< 。
 
#include <iostream>
#include <queue>
 
using namespace std;
 
struct Node{
    int x, y;
    Node( int a= 0, int b= 0 ):
        x(a), y(b) {}
};
 
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 )
    q.push( Node( rand(), rand() ) );
     
    while( !q.empty() ){
        cout << q.top().x << ' ' << q.top().y << endl;
        q.pop();
    }
     
    return 0;
}
 


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

原因是 greater<Node> 没有定义,如果想用这种方法定义则可以按如下方式:

#include <iostream>
#include <queue>
 
using namespace std;
 
struct Node{
    int x, y;
    Node( int a= 0, int b= 0 ):
        x(a), y(b) {}
};
 
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 )
    q.push( Node( rand(), rand() ) );
     
    while( !q.empty() ){
        cout << q.top().x << ' ' << q.top().y << endl;
        q.pop();
    }
     
    return 0;
}
 
还有一点要注意的是priority_queue中的三个参数,后两个可以省去,因为有默认参数,不过如果,有第三个参数的话,必定要写第二个参数。

C++中的vector

C++内置的数组支持容器的机制,但是它不支持容器抽象的语义。要解决此问题我们自己实现这样的类。在标准C++中,用容器向量(vector)实现。容器向量也是一个类模板。标准库vector类型使用需要的头...
  • marsywh
  • marsywh
  • 2010年12月03日 19:36
  • 336

MySQL开发技巧学习笔记二

本文内容来自MySQL开发技巧(二)MySQL开发技巧学习笔记二行列转换行转列使用场景: 1.每天记录的销售额,转为每月的销售额 2.学生成绩转为按科目记 例子共有两张表,user1用户表和...

C++ 用linked list写priority queue

  • 2014年05月22日 08:06
  • 15KB
  • 下载

C++优先队列解决哈夫曼(Huffmam)编码问题 (STL priority_queue)

优先队列解决哈夫曼(Huffmam)编码问题 (STL priority_queue)

c++之STL(8)优先级队列 priority_queue

本文是听的网络课程,而记录下来的学习心得。 自适应容器(容器适配器):不能使用list 特点:数据中最大的放的是队首 从队首拿出来的数据始终是最大的 两种优先级队列: 最大值...

剑指Offer: 数据流中的中位数;C++容器适配器之priority_queue

数据流中的中位数如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值。如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值...
  • BestZem
  • BestZem
  • 2016年08月12日 10:05
  • 520

C++最大堆实现priority_queue优先级队列(算法导论)

max_heapify与build_max_heap过程与heapsort一样 #include #include #include #include using namespace std...

C++排序之数组,Vector,priority_queue

说到c/c++排序,大家肯定想到用algorithm里的排序,或者c里的qsort.但真正理解的又有多少,故现在整理一下. 一.数组排序. sort()函数默认从小到大的排序,如要从大到小的排序,一般...

C++ priority_queue

priority queue在许多的特别场合还是很实用的,因为它带来的便利,人们可以少写很多的代码,所以学习它是有必要的。 很多时候我们会自己定义比较函数,因为标准库默认使用元素类型的在g++编译器中...

C++ STL源码学习(priority_queue内部heap篇)

C++ STL源码之priority_queue依赖数据结构heap实现
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C++中的priority_queue
举报原因:
原因补充:

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