[英]C++ / priority_queue / Expression: invalid comparator
EDIT I included a screenshot of the compile error with reworked code.编辑我包含了带有重新编写的代码的编译错误的屏幕截图。 compile error screenshot
编译错误截图
ORIGINAL POST I am writing a little program to practice my knowledge of priority_queue containers.原始帖子我正在编写一个小程序来练习我对priority_queue 容器的了解。 I am trying to create a priority-queue that takes in Person objects that have an age and sex.
我正在尝试创建一个优先级队列,该队列接收具有年龄和性别的 Person 对象。 The queue is supposed to prioritize older ages and then females over males (ie. older females are prioritized over younger females and females are prioritized over males).
该队列应该优先考虑老年人,然后女性优先于男性(即,年长女性优先于年轻女性,女性优先于男性)。 I've written a predicate that should handle the prioritization but I get a Expression: invalid comparator error when I try to compile the code snippet below.
我编写了一个应该处理优先级的谓词,但是当我尝试编译下面的代码片段时,我得到一个 Expression: invalid comparison 错误。 Can anyone explain what the problem is with my predicate?
谁能解释我的谓词有什么问题?
#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();
}
}
The problem is your less than predicate isn't implemented correctly.问题是您的小于谓词未正确实施。 As written a value will compare less than itself if
isFemale
is true.如所写,如果
isFemale
为真,则值将小于自身。 A value should never compare less than itself with a valid predicate.一个值永远不应该将小于自身的值与有效的谓词进行比较。 You probably want something like this:
你可能想要这样的东西:
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;
}
Your code compiles w/o error for me using C++11.您的代码使用 C++11 为我编译没有错误。 (clang).
(铛)。
In c++03, the compiler complains about vector<Person>> humanStack
- to fix that, insert a space between the two angle brackets thus: vector<Person> > humanStack
在 c++03 中,编译器抱怨
vector<Person>> humanStack
- 为了解决这个问题,在两个尖括号之间插入一个空格: vector<Person> > humanStack
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.