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> humanStack 更改为 vector> humanStack 以删除警告,但您的代码可以正常编译。但是您的比较不太正确,也许尝试在 1 行中使用 return 语句? 我认为该错误是来自 Visual C++ 的运行时错误。它的调试版本包括检测问题的代码,这些问题应该具有严格的弱排序。 【参考方案1】:

问题是您的小于谓词未正确实现。如所写,如果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&lt;Person&gt;&gt; humanStack - 要解决这个问题,请在两个尖括号之间插入一个空格:vector&lt;Person&gt; &gt; humanStack

【讨论】:

一旦你解决了这个问题,我想你会发现你的比较谓词也不太对。 你是对的,谓词中仍有一些不正确的地方。

以上是关于C++/priority_queue/表达式:无效的比较器的主要内容,如果未能解决你的问题,请参考以下文章

带有 lambda 比较器错误的 C++ priority_queue

C++priority_queue模拟实现

C++priority_queue模拟实现

C++priority_queue模拟实现与仿函数讲解

C++priority_queue模拟实现与仿函数讲解

c++优先级队列priority_queue使用lambda表达式出错问题