颠倒优先级队列中元素的顺序

时间:2011-12-23 09:17:01

标签: c++ priority-queue

我正在把东西推进到一个优先级队列中,我已经为那里的元素做了一个比较方法,当我查看订单时,我意识到我希望元素以相反的方式进行,所以我去改变了我的比较方法的所有布尔返回与它们原来的相反,现在它给了我一百万个断言失败。如果我忽略它们,程序仍然按预期工作,但为什么断言失败?该计划为什么要关心?

 bool operator()(charElement &operand1,charElement &operand2)
{
    // If the frequency of op1 < op2 then return true
    if(operand1.i_frequency < operand2.i_frequency) return true; //change to false

    // If the frequency of op1 > op2 then return false
    if(operand1.i_frequency > operand2.i_frequency)return false; //change to true

    // If the frequency of op1 == op2 then return true (that is priority is indicated to be less even though frequencies are equal)
    if(operand1.i_frequency == operand2.i_frequency)return true; //change to false

    // By default , return true (that is priority is indicated to be less)
    return true; //change to false
}

顺便说一句,为什么我的查询被低估?我试着提出理智的问题,我相信这是其中之一。

细节:我将操作符定义更改为@sehe建议的内容。现在,如果我在返回值中添加一个not运算符,它会在include文件(行号2457)中给出断言失败(无效运算符&lt;)。我检查了文件,似乎错误是在一个名为Push_heap_0的内联方法中,但是我对这段代码的作用感到难过

2 个答案:

答案 0 :(得分:4)

难道你不能简单地颠倒参数的顺序吗?也就是说,替换:

bool operator()(charElement &operand1,charElement &operand2)

使用:

bool operator()(charElement &operand2,charElement &operand1)

然后你可以保留功能的主体。

另一方面,比较是只读操作,我们应该始终尊重const正确性:

bool operator()(const charElement& operand2, const charElement& operand1)

此外,如果元素相等,则不允许返回true

if(operand1.i_frequency == operand2.i_frequency)return true;   // HUGE PROBLEM!

在这种情况下,无论您是想要“正常”还是“倒退”,都必须始终返回false

<相反的是不是 >,而是>=。这似乎很难让程序员掌握。

答案 1 :(得分:1)

问题可能是很多事情

  • charElement.i_frequency的类型是什么?
  • 你是如何使用dequeue(类型&amp;&amp;&amp;&amp;&amp;算法调用)

那就是说,看起来你可以大大简化你的比较器。 我喜欢这个

的习惯用语
bool operator()(charElement &operand1,charElement &operand2)
{
    return operand1.i_frequency < operand2.i_frequency;
}

或反向逻辑:

bool operator()(charElement &operand1,charElement &operand2)
{
    return operand1.i_frequency > operand2.i_frequency;
}

如果它实际上是一种化合物而且稍微复杂一些:

bool operator()(charElement &operand1,charElement &operand2)
{
    return std::tie(operand1.i_frequency, operand1.otherfield) < 
               std::tie(operand2.i_frequency, operand2.otherfield);
}