# 标准模板库STL中优先队列Priority Queues使用手册

成员函数：

 empty true if the priority queue has no elements pop removes the top element of a priority queue push adds an element to the end of the priority queue size returns the number of items in the priority queue top returns the top element of the priority queue

priority_queue<int> qi;

priority_queue<int, vector<int>, greater<int> > qi2;

struct node
{
friend bool operator< (node n1, node n2)
{
return n1.priority < n2.priority;
}
int priority;
int value;
};

9          5

8          2

6          1

2          3

1          4

struct node
{
friend bool operator> (node n1, node n2)
{
return n1.priority > n2.priority;
}
int priority;
int value;
};

//代码清单

#include<iostream>
#include<functional>
#include<queue>
using namespace std;
struct node
{
friend bool operator< (node n1, node n2)
{
return n1.priority < n2.priority;
}
int priority;
int value;
};
int main()
{
const int len = 5;
int i;
int a[len] = {3,5,9,6,2};
//示例1
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();
}
cout<<endl;
//示例2
priority_queue<int, vector<int>, greater<int> >qi2;
for(i = 0; i < len; i++)
qi2.push(a[i]);
for(i = 0; i < len; i++)
{
cout<<qi2.top()<<" ";
qi2.pop();
}
cout<<endl;
//示例3
priority_queue<node> qn;
node b[len];
b[0].priority = 6; b[0].value = 1;
b[1].priority = 9; b[1].value = 5;
b[2].priority = 2; b[2].value = 3;
b[3].priority = 8; b[3].value = 2;
b[4].priority = 1; b[4].value = 4;

for(i = 0; i < len; i++)
qn.push(b[i]);
cout<<"优先级"<<'\t'<<"值"<<endl;
for(i = 0; i < len; i++)
{
cout<<qn.top().priority<<'\t'<<qn.top().value<<endl;
qn.pop();
}
return 0;
}

另外贴一段优先队列使用的代码：

#include<iostream>
#include<functional>
#include<queue>
#include<vector>
using namespace std;

struct cmp1
{
bool operator () (int &a, int &b)
{
return a > b ;              // 从小到大排序，值 小的 优先级别高
}
};

struct cmp2
{
bool operator () (int &a, int &b)
{
return a < b;             // 从大到小
}
};

struct number1
{
int x;
bool operator < (const number1 &a)const
{
return x > a.x;         // 从小到大  ，x 小的 优先级别高
}
};

struct number2
{
int x;
bool operator < (const number2 &a)const
{
return x < a.x;            // 从大到小  ，x 大的优先级别高
}
};

int a[] = {14,10,56,7,83,22,36,91,3,47,72,0};
number1 num1[] ={14,10,56,7,83,22,36,91,3,47,72,0};
number2 num2[] ={14,10,56,7,83,22,36,91,3,47,72,0};

int main()
{
priority_queue<int>que;  // 采用默认优先级构造队列  从大到小。

priority_queue<int, vector<int>, cmp1 >que1;
priority_queue<int, vector<int>, cmp2 >que2;

priority_queue<int, vector<int>, greater<int> > que3;  //functional 头文件自带的
priority_queue<int, vector<int>, less<int> > que4;      //functional 头文件自带的

priority_queue<number1> que5;
priority_queue<number2> que6;

int i;
for(i=0;a[i];i++)
{
que.push(a[i]);
que1.push(a[i]);
que2.push(a[i]);
que3.push(a[i]);
que4.push(a[i]);

}

for(i=0;num1[i].x;i++)
que5.push(num1[i]);
for(i=0;num2[i].x;i++)
que6.push(num2[i]);

printf("采用默认优先关系:\n(priority_queue<int>que;)\n");
printf("Queue 0:\n");
while(!que.empty())
{
printf("%3d",que.top());
que.pop();
}
puts("");
puts("");

printf("采用结构体自定义优先级方式一:\n(priority_queue<int,vector<int>,cmp>que;)\n");
printf("Queue 1:\n");
while(!que1.empty())
{
printf("%3d",que1.top());
que1.pop();
}
puts("");

printf("Queue 2:\n");
while(!que2.empty())
{
printf("%3d",que2.top());
que2.pop();
}
puts("");
puts("");

printf("采用头文件\"functional\"内定义优先级：\n(priority_queue<int, vector<int>,greater<int>/less<int> >que;)\n");
printf("Queue 3:\n");
while(!que3.empty())
{
printf("%3d",que3.top());
que3.pop();
}
puts("");

printf("Queue 4 :\n");
while(!que4.empty())
{
printf("%3d",que4.top());
que4.pop();
}
puts("");
puts("");

printf("采用结构体自定义优先级方式二:\n(priority_queue<number>que)\n");
printf("Queue 5:\n");
while(!que5.empty())
{
printf("%3d",que5.top());
que5.pop();
}
puts("");

printf("Queue 6:\n");
while(!que6.empty())
{
printf("%3d",que6.top());
que6.pop();
}

return 0;
}

#include <iostream>
#include <functional>
#include <queue>

using namespace std;

int main()
{
priority_queue<int,vector<int>, greater<int> > q;//从小到大
int n,m,num;
while (cin>>n>>m)
{
int i;
for (i = 0; i < m; i ++)
{
cin>>num;
q.push(num);
}
for (; i < n; i ++)
{
cin>>num;
if (num > q.top())
{
q.pop();
q.push(num);
}
}
while (!q.empty())
{
cout<<q.top()<<" ";
q.pop();
}
cout<<endl;
}
return 0;
}

http://www.cppblog.com/shyli/archive/2007/04/06/21366.html

http://blog.csdn.net/yidujinhuang/article/details/6868093

http://blog.csdn.net/hopeztm/article/details/8026457