C++/priority_queue/表达式:无效的比较器



EDIT我包含了一个编译错误的屏幕截图和重新编写的代码。编译错误屏幕截图

ORIGINAL POST我正在编写一个小程序来练习priority_queue容器的知识。我正在尝试创建一个优先级队列,用于接收具有年龄和性别的Person对象。队列应该优先考虑老年人,然后女性优先于男性(即老年女性优先于年轻女性,女性优先于雄性(。我已经编写了一个应该处理优先级的谓词,但当我试图编译下面的代码片段时,我得到了一个Expression:invalidcomparator错误。有人能解释一下我的谓词有什么问题吗?

#include <stack>
#include <queue>
#include <list>
#include <vector>
#include <iostream>
class Person
{
public: 
int age;
bool isFemale; 
Person(int Age, bool Female)
{
age = Age;
isFemale = Female; 
}
bool operator < (const Person& compareHuman) const
{
bool bRet = false;
if (age < compareHuman.age)
bRet = true;
if (isFemale && compareHuman.isFemale)
bRet = true;
return bRet;    
}
};
int main()
{
std::priority_queue<Person, std::vector<Person>> humanStack;
humanStack.push(Person(15, true));
humanStack.push(Person(42, true));
humanStack.push(Person(76, true));
humanStack.push(Person(65, false));
humanStack.push(Person(21, false));
humanStack.push(Person(35, true));
humanStack.push(Person(15, false));
while(humanStack.size() != 0)
{
std::cout << "This person is age " << humanStack.top().age << std::endl;
humanStack.pop(); 
}
}

问题是您的小于谓词没有正确实现。写入时,如果isFemale为真,则值的比较值将小于自身。一个值与一个有效的谓词的比较永远不应该小于它本身。你可能想要这样的东西:

bool operator < (const Person& compareHuman) const
{
if (age < compareHuman.age)
return true;
else if (compareHuman.age < age)
return false;
// Note the ! added on this line
return isFemale && !compareHuman.isFemale;
}

您的代码使用C++11为我编译时没有错误。(叮当(。

在c++03中,编译器抱怨vector<Person>> humanStack——为了解决这个问题,在两个尖括号之间插入一个空格:vector<Person> > humanStack

最新更新