C++/priority_queue/表达式:无效的比较器
Posted
技术标签:
【中文标题】C++/priority_queue/表达式:无效的比较器【英文标题】:C++ / priority_queue / Expression: invalid comparator 【发布时间】:2020-08-11 01:40:47 【问题描述】:编辑 我在重新编写的代码中包含了编译错误的屏幕截图。 compile error screenshot
原帖 我正在编写一个小程序来练习我对priority_queue 容器的了解。我正在尝试创建一个优先级队列,该队列接收具有年龄和性别的 Person 对象。该队列应该优先考虑老年人,然后女性优先于男性(即,年长女性优先于年轻女性,女性优先于男性)。我编写了一个应该处理优先级的谓词,但是当我尝试编译下面的代码 sn-p 时,我得到一个 Expression: invalid comparison 错误。谁能解释我的谓词有什么问题?
#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();
【问题讨论】:
实际错误信息? 使用GCC 10.2似乎很好 将 vector问题是您的小于谓词未正确实现。如所写,如果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;
【讨论】:
我尝试将谓词修改为您提供的解决方案。但我仍然遇到同样的错误。我编辑到原始帖子以显示错误消息。还有其他想法吗? @SeanBrent 我犯了一个错误,忘记了 compareHuman.age 【参考方案2】:您的代码使用 C++11 为我编译没有错误。 (叮当声)。
在 c++03 中,编译器抱怨 vector<Person>> humanStack
- 要解决这个问题,请在两个尖括号之间插入一个空格:vector<Person> > humanStack
【讨论】:
一旦你解决了这个问题,我想你会发现你的比较谓词也不太对。 你是对的,谓词中仍有一些不正确的地方。以上是关于C++/priority_queue/表达式:无效的比较器的主要内容,如果未能解决你的问题,请参考以下文章