码迷,mamicode.com
首页 > 其他好文 > 详细

优先队列用法

时间:2015-01-07 20:50:38      阅读:301      评论:0      收藏:0      [点我收藏+]

标签:

优先队列用法(即百家之所长写的)

在优先队列中,优先级高的元素先出队列。

标准库默认使用元素类型的<操作符来确定它们之间的优先级关系。

(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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!