标签:
优先队列用法(即百家之所长写的)
在优先队列中,优先级高的元素先出队列。
标准库默认使用元素类型的<操作符来确定它们之间的优先级关系。
(1):
如果我们要把元素从小到大输出怎么办呢?
这时我们可以传入一个比较函数,使用functional.h函数对象作为比较函数。
它的模板声明带有3个参数:
priority_queue<Type,Container,Functional>
其中
Type为数据类型;
Container必须是用数组实现的容器(保存数据),比如vector,deque但不能用list;
Functional为元素的比较方式。
STL里 面 默 认 用 的 是 vector。比 较 方 式 默 认 用 operator<, 所 以 如 果 你 把 后 面 两个参数省略的话,优先队列就是大顶堆,即头元素最大。
1 #include<iostream> 2 3 #include<functional> 4 5 #include<queue> 6 7 using namespace std; 8 9 int main() 10 11 { 12 13 const int len=5; 14 15 int i; 16 17 int a[len]={3,5,9,6,2}; 18 19 20 21 priority_queue<int> qi; 22 23 for(i=0;i<len;i++) 24 25 qi.push(a[i]); 26 27 for(i=0;i<len;i++) 28 29 { 30 31 cout<<qi.top()<<" "; 32 33 qi.pop(); 34 35 } 36 37 return 0; 38 39 }
例1输出结果为:9 6 5 3 2
小顶堆:
则一般要把模板的3个参数都带进去。
STL里面定义了一个仿函数greater<>,对于基本类型可以用这个仿函数声明
小顶堆:
priority_queue<int, vector<int>, greater<int> >qi2
故示例2中输出结果为:2 3 5 6 9
(2):
自定义优先级一:
struct node
{
friend bool operator< (node n1, node n2)
{
return n1.priority < n2.priority;
}
int priority;
int value;
};
在该结构中,value为值,priority为优先级。
通过自定义operator<操作符来比较元素中的优先级。
//代码清单
1 #include<iostream> 2 3 #include<functional> 4 5 #include<queue> 6 7 using namespace std; 8 9 struct node 10 11 { 12 13 friend bool operator< (node n1, node n2) 14 15 { 16 17 return n1.priority < n2.priority; 18 19 } 20 21 int priority; 22 23 int value; 24 25 }; 26 27 int main() 28 29 { 30 31 const int len = 5; 32 33 int i; 34 35 36 37 priority_queue<node> qn; 38 39 node b[len]={{6,1},{9,5},{2,3},{8,2},{1,4}}; 40 41 /* b[0].priority = 6; b[0].value = 1; 42 43 b[1].priority = 9; b[1].value = 5; 44 45 b[2].priority = 2; b[2].value = 3; 46 47 b[3].priority = 8; b[3].value = 2; 48 49 b[4].priority = 1; b[4].value = 4;*/ 50 51 52 53 54 55 for(i = 0; i < len; i++) 56 57 qn.push(b[i]); 58 59 cout<<"优先级"<<‘\t‘<<"值"<<endl; 60 61 for(i = 0; i < len; i++) 62 63 { 64 65 cout<<qn.top().priority<<‘\t‘<<qn.top().value<<endl; 66 67 qn.pop(); 68 69 } 70 71 return 0; 72 73 }
输出结果为:
优先级 值
9 5
8 2
6 1
2 3
1 4
自定义优先级二:
1 #include<stdio.h> 2 3 #include<functional> 4 5 #include<queue> 6 7 #include<vector> 8 9 using namespace std; 10 11 12 13 struct cmp1 14 15 { 16 17 bool operator()(int &a,int &b) 18 19 { 20 21 return a>b;//最小值优先 22 23 } 24 25 }; 26 27 struct cmp2 28 29 { 30 31 bool operator()(int &a,int &b) 32 33 { 34 35 return a<b;//最大值优先 36 37 } 38 39 }; 40 41 struct number1 42 43 { 44 45 int x; 46 47 bool operator<(const number1&a)const 48 49 { 50 51 return x>a.x;//最小值优先 52 53 } 54 55 }; 56 57 struct number2 58 59 { 60 61 int x; 62 63 bool operator<(const number2&a)const 64 65 { 66 67 return x<a.x;//最大值优先 68 69 } 70 71 }; 72 73 int a[]={14,10,56,7,83,22,36,91,3,47,72,0}; 74 75 number1 num1[]={14,10,56,7,83,22,36,91,3,47,72,0}; 76 77 number2 num2[]={14,10,56,7,83,22,36,91,3,47,72,0}; 78 79 80 81 int main() 82 83 { 84 85 int i=0; 86 87 priority_queue<int,vector<int>,cmp1>que1;//最小值优先 88 89 priority_queue<int,vector<int>,cmp2>que2;//最大值优先 90 91 priority_queue<int,vector<int>,less<int> >que4;//最大值优先 92 93 priority_queue<number1>que5;//最小值优先 94 95 priority_queue<number2>que6;//最大值优先 96 97 98 99 for(i=0;a[i];i++) 100 101 { 102 103 que1.push(a[i]); 104 105 que2.push(a[i]); 106 107 que4.push(a[i]); 108 109 } 110 111 for(i=0;num1[i].x;i++) 112 113 que5.push(num1[i]); 114 115 for(i=0;num2[i].x;i++) 116 117 que6.push(num2[i]); 118 119 120 121 printf("采用结构体自定义优先级方式一:\n(priority_queue<int,vector<int>,cmp1/cmp2>que1;)\n"); 122 123 printf("Queue 1\n"); 124 125 while(!que1.empty()) 126 127 { 128 129 printf("%3d",que1.top()); 130 131 que1.pop(); 132 133 } 134 135 printf("\n"); 136 137 printf("Queue 2\n"); 138 139 while(!que2.empty()) 140 141 { 142 143 printf("%3d",que2.top()); 144 145 que2.pop(); 146 147 } 148 149 printf("\n\n"); 150 151 152 153 printf("采用头文件\"functional\"内定义优先级:\n(priority_queue<int,vector<int>,less<int> >que4;)\n"); 154 155 printf("Queue 4:\n"); 156 157 while(!que4.empty()) 158 159 { 160 161 printf("%3d",que4.top()); 162 163 que4.pop(); 164 165 } 166 167 printf("\n\n"); 168 169 170 171 printf("采用结构体自定义优先级方式二:\n(priority_queue<number1/number2>que;)\n"); 172 173 printf("Queue 5:\n"); 174 175 while(!que5.empty()) 176 177 { 178 179 printf("%3d",que5.top()); 180 181 que5.pop(); 182 183 } 184 185 printf("\n"); 186 187 188 189 printf("Queue 6:\n"); 190 191 while(!que6.empty()) 192 193 { 194 195 printf("%3d",que6.top()); 196 197 que6.pop(); 198 199 } 200 201 printf("\n"); 202 203 return 0; 204 205 }
标签:
原文地址:http://www.cnblogs.com/get-an-AC-everyday/p/4209244.html