priority_queue 优先队列使用方法

转载 2015年11月17日 15:51:45

priority_queue调用 STL里面的 make_heap(), pop_heap(), push_heap() 算法实现,也算是堆的另外一种形式。先写一个用 STL 里面堆算法实现的与真正的STL里面的 priority_queue用法相似的priority_queue, 以加深对 priority_queue 的理解

#include <iostream>
#include <algorithm>
#include <vector>

using namespace std;

class priority_queue
{
    private:
        vector<int> data;
        
    public:
        void push( int t ){ 
            data.push_back(t); 
            push_heap( data.begin(), data.end()); 
        }
        
        void pop(){
            pop_heap( data.begin(), data.end() );
            data.pop_back();
        }
        
        int top() { return data.front(); }
        int size() { return data.size(); }
        bool empty() { return data.empty(); }
};


int main()
{
    priority_queue test;
    test.push( 3 );
    test.push( 5 );
    test.push( 2 );
    test.push( 4 );
    
    while( !test.empty() ){
        cout << test.top() << endl;
        test.pop(); }
        
    return 0;

}


STL里面的 priority_queue 写法与此相似,只是增加了模板及相关的迭代器什么的。 

priority_queue 对于基本类型的使用方法相对简单。他的模板声明带有三个参数:
priority_queue

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



#include <iostream>
#include <queue>

using namespace std;

int main(){
    priority_queue<int> q;
    
    for( int i= 0; i< 10; ++) q.push( rand() );
    while( !q.empty() ){
        cout << q.top() << endl;
        q.pop();
    }
    
    getchar();
    return 0;
}


如果要用到小顶堆,则一般要把模板的三个参数都带进去。
STL里面定义了一个仿函数 greater<>,对于基本类型可以用这个仿函数声明小顶堆


#include <iostream>
#include <queue>

using namespace std;

int main(){
    priority_queue<int, vector<int>, greater<int> > q;
    
    for( int i= 0; i< 10; ++) q.push( rand() );
    while( !q.empty() ){
        cout << q.top() << endl;
        q.pop();
    }
    
    getchar();
    return 0;
}


对于自定义类型,则必须自己重载 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.) return a.y> b.y;
    return a.x> b.x; 
}

int main(){
    priority_queue<Node> q;
    
    for( int i= 0; i< 10; ++)
    q.push( Node( rand(), rand() ) );
    
    while( !q.empty() ){
        cout << q.top().<< ' ' << q.top().<< endl;
        q.pop();
    }
    
    getchar();
    return 0;
}


自定义类型重载 operator< 后,声明对象时就可以只带一个模板参数。
但此时不能像基本类型这样声明
priority_queue<node, vector, greater >;
原因是 greater 没有定义,如果想用这种方法定义则可以按如下方式:


#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.) 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; ++)
    q.push( Node( rand(), rand() ) );
    
    while( !q.empty() ){
        cout << q.top().<< ' ' << q.top().<< endl;
        q.pop();
    }
    
    getchar();
    return 0;

//以上代码实现的是一个小顶堆


转自:http://blog.chinaunix.net/uid-533684-id-2100009.html

相关文章推荐

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

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

STL 中优先队列的使用方法(priority_queu)

转载自:http://www.cppblog.com/CodeStream/archive/2011/03/25/142700.html STL 中优先队列的使用方法(priority_...

STL 中优先队列的使用方法(priority_queu)

基本操作: empty() 如果队列为空返回真 pop() 删除对顶元素 push() 加入一个元素 size() 返回优先队列中拥有的元素个数 top() 返回优先队列对顶元素 在默认的...

priority_queue优先队列使用

这个是转得网上的,由于不经常使用,偶尔用的时候还经常出错,所以记下来了,经常使用的已经用红色颜色标出来了 : 在优先队列中,优先级高的元素先出队列。 标准库默认使用元素类型的 优先队列的第一种用...

关于priority_queue(优先队列)的使用

关于priority_queue 1,关于STL中的priority_queue:确定用top()查看顶部元素时,该元素是具有最高优先级的一个元素. 调用pop()删除之后,将促使下一个元素进入该位...

优先队列(priority_queue)

优先队列:顾名思义,首先它是一个队列,但是它强调了“优先”二字,所以,已经不能算是一般意义上的队列了,它的“优先”意指取队首元素时,有一定的选择性,即根据元素的属性选择某一项值最优的出队~ 百度百科...

priority_queue(优先队列)用法总结

利用大数堆或小数堆实现 优先队列(priority queue)   优先级队列 是不同于先进先出队列的另一种队列。每次从队列中取出的是具有最高优先权的元素。        ...

priority_queue优先队列

blue学长的STL小课堂之优先队列/*priority-queue——优先队列*/ /* 常用函数: q.push(x);//入队 q.pop();//出队 q.to...

priority_queue<int,vector<int>,greater<int>>优先队列 按照由小到大顺序

C++优先队列的基本使用方法  #include #include #include using namespace std; struct node {     friend bo...
  • lethic
  • lethic
  • 2012-07-23 01:24
  • 12860

优先队列(Priority Queue)

优先队列(Priority Queue):        是一种用来维护由一组元素构成的集合S的数据结构,其中的每一个元素都有一个相关的值,成为关键字(key)。 简单理解:      ...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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