priority_queue用法
priority_queue在STL中模拟实现
先写一个用STL模板实现的与真正STL的priority_queue用法相似的priority_queue,以加深理解。
#include "iostream"
#include "vector"
#include "string"
#include "queue"
#include "algorithm"
using namespace std;
struct ListNode{
int val;
ListNode* next;
ListNode(int x):val(x),next(NULL){}
};
class priority_queue1{
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 size(){
return data.size();
}
int top(){
return data.front();
}
bool empty(){
return data.empty();
}
protected:
private:
vector<int>data;
};
int main(){
priority_queue1 test;
test.push(6); test.push(3);
test.push(9); test.push(11);
while (!test.empty()){
cout <<test.top()<<endl;
test.pop();
}
return 0;
}
priority_queue的一些介绍
其模板带三个参数:
priority_queue < type , container , functional >
分别代表数据类型,容器,函数比较方式。
容器不能是list,默认为vector
比较方式默认用operator<,这样就是最大堆,对头元素最大
#include "iostream"
#include "vector"
#include "string"
#include "queue"
#include "algorithm"
using namespace std;
struct ListNode{
int val;
ListNode* next;
ListNode(int x):val(x),next(NULL){}
};
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;
}
- return a.x>b.x 似乎是顶端最小,尾部最大
- Node(rand(),rand()) – 注意这边是括号呢