C++ STL priority_queue

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

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

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

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

对于自定义类型,则必须自己重载 operator< 或者自己写仿函数先看看例子:

#include   
#include   
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_queueq;  
    for(int i=0;i<10;i++){  
        node.x=i;  
        node.y=10-i/2;  
        q.push(node);  
    }     
    while(!q.empty()){  
        cout<' '<return 0;  
}  

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

#include   
#include   
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_queuevector,cmp>q;  
    for(int i=0;i<10;i++){  
        node.x=i;  
        node.y=10-i/2;  
        q.push(node);     
    }     
    while(!q.empty()){  
        cout<' '<return 0;  
}  

你可能感兴趣的:(C/C++,算法,stl)