前言:
目前大家对“优先队列java使用”大约比较关注,看官们都需要了解一些“优先队列java使用”的相关内容。那么小编同时在网上网罗了一些关于“优先队列java使用””的相关内容,希望兄弟们能喜欢,咱们快快来了解一下吧!Priority Queue
优先队列和一般的队列(queue)不同之处在于,优先队列里的元素具有权值,在出队列时总是权值最大的元素出列,本质是一个heap。
C++ Define
template <class Type, class Container= vector <Type>, class Compare= less <typename Container ::value_type>>
class priority_queue
Parameters
常用的Member Functions
Requirements#include<queue>using namespace std;Simple Testempty() and push()
#include<queue>
#include<iostream>
using namespace std;
int main(){
priority_queue <int> q;
if(q.empty())
cout << "the priority_queue is empty." << endl;
q.push(20);
if(!q.empty())
cout << "the priority_queue is not empty." << endl;
return 0;
}
the priority_queue is empty.
the priority_queue is not empty.
size()
#include<queue>
#include<iostream>
using namespace std;
int main(){
priority_queue <int> q;
cout << "q.size is " << q.size() <<endl;
q.push(20);
q.push(30);
cout << "q.size is " << q.size() <<endl;
return 0;
}
q.size is 0
q.size is 2
pop() and top()
#include<queue>
#include<iostream>
using namespace std;
int main(){
priority_queue <int> q;
q.push(20);
q.push(30);
q.push(19);
cout << "q.size is " << q.size() << endl;
cout << "Queue q's current top is " << q.top() << endl;
q.pop();
cout << "Queue q pops the top element." << endl;
cout << "Queue q's current top is " << q.top() << endl;
cout << "q.size is " << q.size() << endl;
return 0;
}
q.size is 3
Queue q's current top is 30
Queue q pops the top element.
Queue q's current top is 20
q.size is 2
Advanced元素排序
默认情况下,优先队列内部是一个大根堆,元素从大到小从队首排至队尾。
#include<queue>
#include<iostream>
using namespace std;
int main(){
priority_queue <int> q; //相当于 priority_queue < int, vector<int>, less<int> > q;
q.push(20);
q.push(30);
q.push(7);
q.push(5);
q.push(12);
q.push(0);
q.push(32);
cout << "output order is :";
while( !q.empty() ){
cout << q.top() << " ";
q.pop();
}
return 0;
}
output order is :32 30 20 12 7 5 0
可以将队列声明参数Compare对应的less改成greater,此时内部大根堆变成小根堆,元素从小到大排列
output order is :0 5 7 12 20 30 32
运算符重载
在实际使用中,我们往往需要对结构体数组/类按照某一个成员的值进行排序,比如想对学生所有科目中的语文成绩进行排序,那么就需要重载比较操作符函数,即参数Compare所指向的函数。
compare可以选择greater或者less,C++ 11定义两者分别为:
less
template <class T> struct less {
bool operator() (const T& x, const T& y) const {return x < y;}
typedef T first_argument_type;
typedef T second_argument_type;
typedef bool result_type;
};
greater
template <class T> struct greater {
bool operator() (const T& x, const T& y) const {return x > y;}
typedef T first_argument_type;
typedef T second_argument_type;
typedef bool result_type;
};
一般而言,排序时greater对应从大到小顺序,less对应从小到大顺序。但是在优先级队列里,less对应的是从大到小出队列,greater对应从小到大出队列,在前面示例的简单元素排序中可以看到刚好相反,这么实现的具体原因暂不探究。
在自定义结构体优先级时,可以使用以下两种方式:
//方式一:以成员函数的形式
#include<queue>
#include<iostream>
using namespace std;
struct Student{
//简单起见,只定义两个成绩变量
int num;
int math;
Student(int n, int m){
num = n;
math = m;
}
bool operator< (const Student &s) const { //这里const不能漏,会报错(codeblocks)
return math > s.math;
}
};
int main(){
priority_queue < Student, vector<Student>, less<Student> > q;
q.push(Student(7,80));
q.push(Student(6,30));
q.push(Student(3,45));
q.push(Student(2,100));
q.push(Student(5,76));
q.push(Student(10,34));
cout << "数学成绩排序为:" ;
while( !q.empty() ){
cout<< q.top().math << " ";
q.pop();
}
return 0;
}
//方式二:以结构体形式
#include<queue>
#include<iostream>
using namespace std;
struct Student{
//简单起见,只定义两个成绩变量
int num;
int math;
Student(int n, int m){
num = n;
math = m;
}
};
struct cmp{
bool operator ()(const Student s1, const Student s2){
return s1.math < s2.math;
}
};
int main(){
priority_queue < Student, vector<Student>, cmp > q; //这里要用结构体cmp替换原来的less/greater
q.push(Student(7,80));
q.push(Student(6,30));
q.push(Student(3,45));
q.push(Student(2,100));
q.push(Student(5,76));
q.push(Student(10,34));
cout << "数学成绩排序为:" ;
while( !q.empty() ){
cout<< q.top().math << " ";
q.pop();
}
return 0;
}
输出结果均为:
数学成绩排序为:100 80 76 45 34 30
注意
针对方式一,如果在声明中compare选择greater,则在结构体中重载函数名必须对应为operator >,即重载运算符>;同理,less对应operator <,即重载运算符<, 即:
//greater ----- operator>
priority_queue < Student, vector<Student>, greater<Student> > q;
bool operator> (const Student &s) const {}
//less ----- operator<
priority_queue < Student, vector<Student>, less<Student> > q;
bool operator< (const Student &s) const {}
针对方式二,重载运算符必须是(), 即:
bool operator ()(const Student s1, const Student s2) {}
否则会报错。
但是,最终排序结果只与return语句中的运算符有关,即:
//如果你想让元素从大到小出列,则return中运算符应为'<'
return math < s.math;
//如果你想让元素从小到大出列,则return中运算符应为'>' r
eturn math > s.math
山东掌趣网络科技
标签: #优先队列java使用