cpp stl::priority 使用 2 个键的队列未正确排序
cpp stl::priority queue using 2 keys not sorting correctly
我定义了一个结构如下:
using namespace std;
struct Person {
int id;
int age;
string country_of_origin;
};
我正在尝试使用 STL 优先级队列 class 根据 id 对人员进行升序排序,并根据原产国按字典顺序对具有匹配 id 的值进行排序。下面是我的代码:
#include <queue>
#include <vector>
#include <iostream>
#include <queue>
#include <string>
using namespace std;
struct Person {
int id;
int age;
string country_of_origin;
};
struct PersonCompare
{
bool operator()(const Person &p1, const Person &p2) const
{
if (p1.id>p2.id) {
return true;
} else if (p1.country_of_origin>p2.country_of_origin){
return true;
} else {
return false;
}
}
};
int main(int argc, char ** argv)
{
Person p={1,2,"Zimbabwe"};
Person q={3,4,"New Zealand"};
Person r={5,7,"Wales"};
Person s={2,3,"India"};
Person t={1,4,"Sri Lanka"};
Person u={1,4,"Benin"};
priority_queue<Person,vector<Person>,PersonCompare> queue;
queue.push(p);
queue.push(q);
queue.push(r);
queue.push(s);
queue.push(t);
queue.push(u);
while (!queue.empty())
{
Person p = queue.top();
cout << p.id << "\t"<<p.age<<"\t"<<p.country_of_origin<<endl;
queue.pop();
}
}
我得到的输出是:
1 4 Benin
2 3 India
3 4 New Zealand
1 4 Sri Lanka
1 2 Zimbabwe
5 7 Wales
而不是:
1 4 Benin
1 4 Sri Lanka
1 2 Zimbabwe
2 3 India
3 4 New Zealand
5 7 Wales
为什么会这样?
您可以通过对第一个字段进行排序来进行字典顺序比较,仅当它们相等,然后测试第二个字段以打破平局。如果按如下方式重写比较器,它应该可以工作:
struct PersonCompare
{
bool operator()(const Person &p1, const Person &p2) const
{
if (p1.id > p2.id) {
return true;
} else if (p1.id < p2.id) {
return false;
}
return p1.country_of_origin > p2.country_of_origin;
}
};
另一种方法是使用std::tie
,比较简洁和正确的字典序比较:
#include <tuple>
struct PersonCompare
{
bool operator()(const Person &p1, const Person &p2) const
{
return std::tie(p1.id, p1.country_of_origin) > std::tie(p2.id, p2.country_of_origin);
}
};
我定义了一个结构如下:
using namespace std;
struct Person {
int id;
int age;
string country_of_origin;
};
我正在尝试使用 STL 优先级队列 class 根据 id 对人员进行升序排序,并根据原产国按字典顺序对具有匹配 id 的值进行排序。下面是我的代码:
#include <queue>
#include <vector>
#include <iostream>
#include <queue>
#include <string>
using namespace std;
struct Person {
int id;
int age;
string country_of_origin;
};
struct PersonCompare
{
bool operator()(const Person &p1, const Person &p2) const
{
if (p1.id>p2.id) {
return true;
} else if (p1.country_of_origin>p2.country_of_origin){
return true;
} else {
return false;
}
}
};
int main(int argc, char ** argv)
{
Person p={1,2,"Zimbabwe"};
Person q={3,4,"New Zealand"};
Person r={5,7,"Wales"};
Person s={2,3,"India"};
Person t={1,4,"Sri Lanka"};
Person u={1,4,"Benin"};
priority_queue<Person,vector<Person>,PersonCompare> queue;
queue.push(p);
queue.push(q);
queue.push(r);
queue.push(s);
queue.push(t);
queue.push(u);
while (!queue.empty())
{
Person p = queue.top();
cout << p.id << "\t"<<p.age<<"\t"<<p.country_of_origin<<endl;
queue.pop();
}
}
我得到的输出是:
1 4 Benin
2 3 India
3 4 New Zealand
1 4 Sri Lanka
1 2 Zimbabwe
5 7 Wales
而不是:
1 4 Benin
1 4 Sri Lanka
1 2 Zimbabwe
2 3 India
3 4 New Zealand
5 7 Wales
为什么会这样?
您可以通过对第一个字段进行排序来进行字典顺序比较,仅当它们相等,然后测试第二个字段以打破平局。如果按如下方式重写比较器,它应该可以工作:
struct PersonCompare
{
bool operator()(const Person &p1, const Person &p2) const
{
if (p1.id > p2.id) {
return true;
} else if (p1.id < p2.id) {
return false;
}
return p1.country_of_origin > p2.country_of_origin;
}
};
另一种方法是使用std::tie
,比较简洁和正确的字典序比较:
#include <tuple>
struct PersonCompare
{
bool operator()(const Person &p1, const Person &p2) const
{
return std::tie(p1.id, p1.country_of_origin) > std::tie(p2.id, p2.country_of_origin);
}
};