C++ priority queue custom comparator
Method1
#include <iostream>
#include <string>
#include <vector>
#include <queue>
using namespace std;
class Student{
public:
Student(const string& name, int age):name(name), age(age){}
friend bool operator<(const Student& lhs, const Student& rhs){
if(lhs.name == lhs.name){
return lhs.age < rhs.age;
}
return lhs.name < rhs.name;
}
void output() const{
cout<<"Name "<<name<<" Age "<<age<<endl;
}
public:
string name;
int age;
};
int main(){
priority_queue<Student> q;
q.push(Student{"John", 21});
q.push(Student{"John", 12});
q.push(Student{"Ann", 24});
while(!q.empty()){
q.top().output();
q.pop();
}
return 0;
}
Method2
#include <iostream>
#include <string>
#include <vector>
#include <queue>
using namespace std;
class Student{
public:
Student(const string& name, int age):name(name), age(age){}
bool operator<(const Student& other) const{
if(name == other.name){
return age < other.age;
}
return name < other.name;
}
void output() const{
cout<<"Name "<<name<<" Age "<<age<<endl;
}
public:
string name;
int age;
};
int main(){
priority_queue<Student> q;
q.push(Student{"John", 21});
q.push(Student{"John", 12});
q.push(Student{"Ann", 24});
while(!q.empty()){
q.top().output();
q.pop();
}
return 0;
}
Method3
#include <iostream>
#include <string>
#include <vector>
#include <queue>
using namespace std;
class Student{
public:
Student(const string& name, int age):name(name), age(age){}
void output() const{
cout<<"Name "<<name<<" Age "<<age<<endl;
}
public:
friend struct comp;
string name;
int age;
};
struct comp{
bool operator()(const Student& lhs, const Student& rhs){
if(lhs.name == lhs.name){
return lhs.age < rhs.age;
}
return lhs.name < rhs.name;
}
};
int main(){
priority_queue<Student, vector<Student>, comp> q;
q.push(Student{"John", 21});
q.push(Student{"John", 12});
q.push(Student{"Ann", 24});
while(!q.empty()){
q.top().output();
q.pop();
}
return 0;
}
Method4 *
#include <iostream>
#include <string>
#include <vector>
#include <queue>
using namespace std;
class Student{
public:
Student(const string& name, int age):name(name), age(age){}
void output() const{
cout<<"Name "<<name<<" Age "<<age<<endl;
}
public:
string name;
int age;
};
bool comp(const Student& lhs, const Student& rhs){
if(lhs.name == lhs.name){
return lhs.age < rhs.age;
}
return lhs.name < rhs.name;
}
int main(){
priority_queue<Student, vector<Student>, std::function<bool(const Student&, const Student&)>> q(comp);
q.push(Student{"John", 21});
q.push(Student{"John", 12});
q.push(Student{"Ann", 24});
while(!q.empty()){
q.top().output();
q.pop();
}
return 0;
}
Method5
#include <iostream>
#include <string>
#include <vector>
#include <queue>
using namespace std;
class Student{
public:
Student(const string& name, int age):name(name), age(age){}
void output() const{
cout<<"Name "<<name<<" Age "<<age<<endl;
}
public:
string name;
int age;
};
int main(){
auto comp = [](const Student& lhs, const Student& rhs)->bool{
if(lhs.name == lhs.name){
return lhs.age < rhs.age;
}
return lhs.name < rhs.name;
};
priority_queue<Student, vector<Student>, decltype(comp)> q(comp);
q.push(Student{"John", 21});
q.push(Student{"John", 12});
q.push(Student{"Ann", 24});
while(!q.empty()){
q.top().output();
q.pop();
}
return 0;
}