[英]Find if two variables are equal only with less than operator
我正在尝试实现二叉搜索树,我需要一个函数来告诉我树中是否已存在元素! 然而,我唯一可以使用的操作符是< 。 这甚至可能吗?
我已经尝试过(a<b) || (b<a)
(a<b) || (b<a)
和!(a<b) && !(b<a)
注意:我只允许使用<来比较二叉树中的元素。
你可以用C ++编写
not ( a < b or b < a )
这相当于
not ( a < b ) and not ( b < a )
虽然对于二进制搜索树,表达式不是必需的,因为通常使用if_else
语句就足够了
if ( a < b )
{
// ...
}
else if ( b < a )
{
//...
}
else /* a == b */
{
//...
}
仅给出operator<
的实现,您不能保证a == b
。
这是因为存在称为“部分排序”的概念,在特殊情况下,该概念可以允许两个对象可以相互有条件地排序的情况 。
作为示例,考虑描述类继承的图。 我们可以定义以下规则:
A
等于类B
如果A
和B
描述相同的类。 A
比类更大B
如果A
是类的超类B
或者是类的超类的类的超类B
或等( B
从继承A
,或B
从继承C
从继承A
等) A
小于类B
如果A
是的一个子类B
( A
从继承B
,或A
从继承C
从继承B
等) A
类彼此没有关系,则A
类不按 B
类命令 ( A
不从B
继承, B
不从A
继承) A
都继承自同一个超类,则它不是针对类B
排序的 ,否则没有关系( A
继承自C
, B
继承自C
) A
类是从相同的子类相互继承的, 则不对 B
类进行排序 ,否则它们没有关系( C
继承自A
和B
) 考虑到以下功能,这使得它完全合理:
std::string compare(T const& a, T const& b) {
if(a == b)
return "Equal to";
else if(a < b)
return "Less than";
else if(a <= b)
return "Less than or Equal to";
else if(a > b)
return "Greater than";
else if(a >= b)
return "Greater than or Equal to";
else
return "Unordered to";
}
给定一些输入,输出可以是"Unordered to"
。
保证两个泛型参数彼此相等的唯一方法是为operator==
重载。
现在,对你来说好消息是,如果你正在构建二进制搜索树,那么有一个不成文的约定,用于比较的类型至少应该是弱有序的(这意味着a==b
将返回与!(a < b || b < a)
相同!(a < b || b < a)
)。 因此,在您的特定情况下,只要提供的键值被弱排序, !(a < b || b < a)
将始终在对象相等时返回true。
但是您确实需要一些机制来确保用户不会尝试将部分排序的密钥传递给比较函数。 否则,您需要完整的operator==
实现。
PS:在有人跳进并说“算术类型怎么样?”之前,我会提醒你NaN
存在符合IEEE标准的浮点值,其中a < b
和b < a
都可以返回false。 如果a
和b
都是NaN
, a == b
也可以返回false,即使两个NaN
值都具有相同的有效载荷! 此外,这种关系仅保证二进制补码表示中的整数,这是C ++标准不需要的 。
作为一个例证,可以用于做ints
是这样的:
bool isEqual(int a, int b)
{
if((!(a < b)) && (!(b < a)))
return true;
return false
}
如果你不能使用偶数&&
运算符,你可以嵌套if语句。 有比实际需要的更多()
,这只是为了使评估的顺序更加明显。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.