我正在把东西推进到一个优先级队列中,我已经为那里的元素做了一个比较方法,当我查看订单时,我意识到我希望元素以相反的方式进行,所以我去改变了我的比较方法的所有布尔返回与它们原来的相反,现在它给了我一百万个断言失败。如果我忽略它们,程序仍然按预期工作,但为什么断言失败?该计划为什么要关心?
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的内联方法中,但是我对这段代码的作用感到难过
答案 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)
问题可能是很多事情
那就是说,看起来你可以大大简化你的比较器。 我喜欢这个
的习惯用语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);
}