首页 > 代码库 > STL中优先队列的使用
STL中优先队列的使用
普通的队列是一种先进先出的数据结构,元素在队列尾追加,而从队列头删除。在优先队列中,元素被赋予优先级。当访问元素时,具有最高优先级的元素最先删除。优先队列具有最高级先出的行为特征。我们来说一下C++的STL queue库中优先队列的使用方法。STL默认使用<操作符来确定对象之间的优先级关系,所以如果要使用自定义对象,需要重载<操作符。优先队列有两种,一种是最大优先队列;一种是最小优先队列;每次取自队列的第一个元素分别是优先级最大和优先级最小的元素。
使用头文件queue。
优先队列的操作:
q.empty() 判断是否为空
q.size() 返回队列中元素的个数
q.pop() 删除队首元素,但不返回其值
q.top() 返回具有最高优先级的元素值,但不删除该元素
q.push() 在基于优先级的适当位置插入新元素
默认优先级为最大优先,除此之外共有3种自定义优先级方式。
1 #include <iostream> 2 #include <functional> 3 #include <queue> 4 #include <vector> 5 6 using namespace std; 7 8 struct cmp1//定义比较结构 9 { 10 bool operator ()(int &a,int &b) 11 { 12 return a>b;//最小值优先 13 } 14 }; 15 16 struct cmp2 17 { 18 bool operator ()(int &a,int &b) 19 { 20 return a<b;//最大值优先 21 } 22 }; 23 24 struct number1//自定义数据结构 25 { 26 int x; 27 28 bool operator < (const number1 &a) const 29 { 30 return x>a.x;//最小值优先 31 } 32 }; 33 34 struct number2 35 { 36 int x; 37 38 bool operator < (const number2 &a) const 39 { 40 return x<a.x;//最大值优先 41 } 42 }; 43 44 int main() 45 { 46 int n; 47 cin>>n; 48 int a[50]; 49 number1 num1[50]; 50 number2 num2[50]; 51 for(int i=0;i<n;i++) 52 { 53 cin>>a[i]; 54 num1[i].x=a[i]; 55 num2[i].x=a[i]; 56 } 57 cout<<endl; 58 priority_queue<int>Q0;//采用默认优先级构造队列 59 priority_queue<int,vector<int>,cmp1>Q1;//最小值优先 60 priority_queue<int,vector<int>,cmp2>Q2;//最大值优先 61 priority_queue<int,vector<int>,greater<int> >Q3;//一定要有空格“> >”,“>>”会被认为错误 62 priority_queue<int,vector<int>,less<int> >Q4;////最大值优先 63 priority_queue<number1>Q5; //最小优先级队列 64 priority_queue<number2>Q6; //最大优先级队列 65 int i; 66 for(i=0; i<n; i++) 67 { 68 Q0.push(a[i]); 69 Q1.push(a[i]); 70 Q2.push(a[i]); 71 Q3.push(a[i]); 72 Q4.push(a[i]); 73 } 74 for(i=0; i<n; i++) 75 Q5.push(num1[i]); 76 for(i=0; i<n; i++) 77 Q6.push(num2[i]); 78 //采用默认优先关系 (priority_queue<int>que) 79 cout<<"Queue0:"<<endl; 80 while(!Q0.empty()) 81 { 82 cout<<Q0.top()<<" "; 83 Q0.pop(); 84 } 85 cout<<endl<<endl; 86 //采用结构体自定义优先级方式一 (priority_queue<int,vector<int>,cmp>que) 87 cout<<"Queue1:"<<endl; 88 while(!Q1.empty()) 89 { 90 cout<<Q1.top()<<" "; 91 Q1.pop(); 92 } 93 cout<<endl; 94 cout<<"Queue2:"<<endl; 95 while(!Q2.empty()) 96 { 97 cout<<Q2.top()<<" "; 98 Q2.pop(); 99 } 100 cout<<endl<<endl; 101 //采用头文件functional内定义优先级 (priority_queue<int,vector<int>,greater<int>/less<int> >que) 102 cout<<"Queue3:"<<endl; 103 while(!Q3.empty()) 104 { 105 cout<<Q3.top()<<" "; 106 Q3.pop(); 107 } 108 cout<<endl; 109 cout<<"Queue4:"<<endl; 110 while(!Q4.empty()) 111 { 112 cout<<Q4.top()<<" "; 113 Q4.pop(); 114 } 115 cout<<endl<<endl; 116 //采用结构体自定义优先级方式二 (priority_queue<number>que) 117 cout<<"Queue5:"<<endl; 118 while(!Q5.empty()) 119 { 120 cout<<Q5.top().x<<" "; 121 Q5.pop(); 122 } 123 cout<<endl; 124 cout<<"Queue6:"<<endl; 125 while(!Q6.empty()) 126 { 127 cout<<Q6.top().x<<" "; 128 Q6.pop(); 129 } 130 cout<<endl; 131 return 0; 132 }
运行结果:
STL中优先队列的使用
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。