【发布时间】:2020-01-18 10:38:15
【问题描述】:
我有以下运算符
inline bool operator < (const obj& a, const obj& b)
{
if(a.field1< b.field1)
return true;
else
return a.field2 < b.field2;
}
我觉得这是不正确的,如果不对成员变量进行第三次比较测试,您将无法做到这一点,但我找不到任何这不起作用的示例。 那么这真的会像预期的那样排序吗? 谢谢
编辑: 我会把它编码为:
inline bool operator < (const obj& a, const obj& b)
{
if(a.field1< b.field1)
return true;
else if(a.field1> b.field1)
return false;
else
return a.field2 < b.field2;
}
有什么不同吗?我问是因为我知道我的经验是正确的,但也比第一个更长
【问题讨论】:
-
为什么它不能工作?也许您应该更好地解释您的感受以及“按预期排序”是什么。
-
您的原件以
if( obj(2,1) < obj(1,2) )失败。 -
那么这就是严格的弱排序吗?如果我至少确定没有运行时错误,我会很好的
-
这对我来说是一个相当普遍的习惯用法 - 检查除了最后一个成员之外的每个成员
<然后是>,仅在以后继续检查==案例。然后对于你不关心==与>的最后一个字段,所以只需返回<结果。就个人而言,我会将每个 if 语句写在一行上,而不会打扰else,因为return无论如何都会退出该函数。 -
@Rob - 我错过了什么?据我所知,该功能作为非会员应该没问题。字段比较是否有效仅取决于字段类型是否定义了 operator。实际上-更正我之前的评论-我通常会检查
(a.f1 < b.f1)然后(b.f1 < a.f1)。 IIRC 当您从标准库中定义operator<时,您会得到一个自动的operator>,但即使由于某种原因失败,这也是可以的。
标签: c++ comparison-operators lexicographic