查找两个变量是否等于只有小于运算符
我试图实现一个二叉搜索树,我需要一个函数告诉我一个元素是否已经存在于树中! 但是我唯一可以使用的运营商是<。 这甚至可能吗?查找两个变量是否等于只有小于运算符
我已经尝试过 和(a<b) || (b<a)
!(a<b) && !(b<a)
注:我只允许使用<比较我的元素二叉树。
您要找的表情为:
!(a < b || b < a)
即相当于:
!(a < b) && !(b < a)
因为Boolean algebra和logical operators。
完整的示例:
#include <iostream>
int main() {
int a = 2, b = 2;
if (!(a < b || b < a)) {
std::cout << "Are equal.";
}
else {
std::cout << "Are not equal.";
}
}
作为一个例子,你可以为ints
这样做:
bool isEqual(int a, int b)
{
if((!(a < b)) && (!(b < a)))
return true;
return false
}
如果您无法使用甚至&&
运营商,你可以嵌套的if语句。还有更多()
s,这只是为了让评估顺序更加明显。
假设提供的'operator
无法保证,只给予operator<
的执行,即a == b
。
这是因为存在一个所谓的“偏序”的概念,这可能,异常情况下,允许这样一个场景,两个物体可以有条件下令反目成仇。
作为示例,考虑描述类继承的图。我们可以定义以下规则:
- 类
A
等于类B
如果A
和B
描述同一类。 - 类
A
比B
类更大如果A
是B
一个超类或是B
或等类的超类的(从A
B
继承,或B
继承C
从A
继承等)类的超类 - 类
A
小于B
类如果A
是B
一个子类(从B
A
继承,或从C
从B
继承等A
继承) - 类
A
不会相对于命令B
类,如果它们没有相对于彼此(A
不从B
继承,并B
不从A
继承) -
A
类不相对于有序类B
如果他们都来自同一个超类继承,但在其他方面没有关系(从C
A
继承,从C
B
继承) - 类
A
没有相对于责令B
类,如果他们相互来自同一个子类继承,但在其他方面没有关系(来自A
C
继承和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)
将总是当对象相等时返回true。
但是您确实需要一些机制来确保用户不会尝试将部分排序的键传递给您的比较函数。否则,你坚持要求完整的operator==
实施。
P.S:之前有人跳进去说:“什么事?关于算术类型”,我想提醒你,NaN
存在兼容IEEE浮点值,其中a < b
和b < a
既可以返回false。如果a
和b
都是NaN
,即使两个NaN
值具有相同的有效负载,a == b
也可以返回false!此外,这种关系是只保证整数在一个二进制补码表示,其中C++标准不需要。
你只能做两件事:'a David
[运算符
如果两个值中的任何一个都小于另一个,则它们必须是等于。 –