1 #include <iostream> 2 #include <queue> 3 4 #include <functional> 5 using namespace std; 6 7 int main() 8 { 9 /*在优先队列中,优先级高的元素先出队列。 10 标准库默认使用元素类型的<操作符来确定它们之间的优先级关系。 11 优先队列的第一种用法,也是最常用的用法: 12 13 priority_queue<int> qi; 14 通过<操作符可知在整数中元素大的优先级高。 15 16 const int len=12; 17 int a[len]={14,10,56,7,83,22,36,91,3,47,72,0}; 18 priority_queue<int> q1; 19 for(int i=0;i<len;i++){ 20 q1.push(a[i]); 21 } 22 while(!q1.empty()){ 23 cout<<q1.top()<<" "; 24 q1.pop(); 25 } 26 27 */ 28 29 30 31 /* 32 **********************第二种方法: 33 在示例1中,如果我们要把元素从小到大输出怎么办呢? 34 这时我们可以传入一个比较函数,使用functional函数对象作为比较函数。 35 36 priority_queue<int, vector<int>, greater<int> >q1; 37 其中 38 第二个参数为容器类型。 39 第二个参数为比较函数。 40 */ 41 42 43 const int len=12; 44 int a[len]={14,10,56,7,83,22,36,91,3,47,72,0}; 45 priority_queue<int,vector<int>,less<int> > q1; 46 for(int i=0;i<len;i++){ 47 q1.push(a[i]); 48 } 49 while(!q1.empty()){ 50 cout<<q1.top()<<" "; 51 q1.pop(); 52 } 53 54 55 /* 56 第三种方法: 57 自定义优先级。 58 59 struct node 60 { 61 friend bool operator< (node n1, node n2) 62 { 63 return n1.priority < n2.priority; 64 } 65 int priority; 66 int value; 67 }; 68 在该结构中,value为值,priority为优先级。 69 通过自定义operator<操作符来比较元素中的优先级。 70 在示例3中输出结果为: 71 优先级 值 72 9 5 73 8 2 74 6 1 75 2 3 76 1 4 77 但如果结构定义如下: 78 79 struct node 80 { 81 friend bool operator> (node n1, node n2) 82 { 83 return n1.priority > n2.priority; 84 } 85 int priority; 86 int value; 87 }; 88 则会编译不过(G++编译器) 89 因为标准库默认使用元素类型的<操作符来确定它们之间的优先级关系。 90 而且自定义类型的<操作符与>操作符并无直接联系,故会编译不过。 91 92 */ 93 94 /* 95 kuangbin写法: 96 struct Node 97 { 98 int D,P; 99 }node[MAXN]; 100 bool cmp1(Node a,Node b) 101 { 102 return a.D<b.D; 103 } 104 105 struct cmp 106 { 107 bool operator ()(int x, int y) 108 { 109 return x > y;// x小的优先级高 110 //也可以写成其他方式,如: return p[x] > p[y];表示p[i]小的优先级高 111 } 112 }; 113 priority_queue<int, vector<int>, cmp>q;//定义方法 114 115 116 strunct cmp{ 117 118 bool operator () (int x,int y) 119 { 120 return x > y; 121 } 122 } 123 124 125 */ 126 127 128 129 130 131 132 133 return 0; 134 }