C++ 查找两个变量是否仅使用小于运算符相等
我正在尝试实现一个二进制搜索树,我需要一个函数来告诉我树中是否已经存在元素! 然而,我唯一可以使用的运算符是,您可以用C编写++C++ 查找两个变量是否仅使用小于运算符相等,c++,algorithm,binary-tree,binary-search-tree,C++,Algorithm,Binary Tree,Binary Search Tree,我正在尝试实现一个二进制搜索树,我需要一个函数来告诉我树中是否已经存在元素! 然而,我唯一可以使用的运算符是,您可以用C编写++ not ( a < b or b < a ) 您要查找的表达式是: !(a < b || b < a) !(a
not ( a < b or b < a )
您要查找的表达式是:
!(a < b || b < a)
!(a
这相当于:
!(a < b) && !(b < a)
!(a
因为和。完整示例:
#include <iostream>
int main() {
int a = 2, b = 2;
if (!(a < b || b < a)) {
std::cout << "Are equal.";
}
else {
std::cout << "Are not equal.";
}
}
#包括
int main(){
INTA=2,b=2;
如果(!(astd::cout作为一个例子,您可以为int
这样做:
bool isEqual(int a, int b)
{
if((!(a < b)) && (!(b < a)))
return true;
return false
}
bool-isEqual(int a,int b)
{
如果((!(a
如果您甚至不能使用&&
运算符,您可以嵌套If语句。有比需要更多的()
s,这只是为了使求值顺序更加明显。您不能保证,因为只有运算符=b)的实现)
返回“大于或等于”;
其他的
返回“无序到”;
}
给定一些输入,输出可能是无序的
保证两个泛型参数彼此相等的唯一方法是为运算符==
设置重载
现在,好消息是,如果你正在构建一个二元搜索树,有一个不成文的约定,用于比较的类型至少应该是弱有序的(这意味着a==b
将返回与相同的结果!(a
)。因此,在您的特定情况下,只要提供的键值是弱序的,!(a
在对象相等时将始终返回true
但是,您确实需要一些机制来确保用户不会试图将偏序键传递给比较函数。否则,您将需要一个完整的操作符==
实现
附言:在有人插嘴说“算术类型呢?”,我想提醒您,对于符合IEEE标准的浮点值,NaN
存在,其中a
和b
都可以返回false。a==b
如果a
和b
都是NaN
,即使这两个NaN
值具有相同的有效负载,也可以返回false!此外,这个r在两个夸表示中,整数的唯一性是:<强> > C++标准不要求< /强> .< /p>。你只能做2种可能的事情:<代码> a < b < /> >和<代码> b < a /代码>。想想它,如果这两个都不是真的,那么可能的算子重复和严格的弱ORD怎么办?eringIf两个值都不小于另一个,它们必须相等。可以安全地假设提供的运算符是一些答案。详细解释了我所困惑的一切。谢谢you@Siyavash然后将这一个标记为实际的右侧answer@Xirema浮点数不需要精确相等,也不能保证w也可用于浮点数。NaN
值可能导致出现a@Xirema我已经回答了您的评论。请不要重复。在您的代码中,使用NaN
存储值会导致搜索2.5
返回存储在NaN
的值。这不可能是正确的代码。@Xiremau可以向C++标准委员会提出建议,重写基于操作符的所有标准算法。
#include <iostream>
int main() {
int a = 2, b = 2;
if (!(a < b || b < a)) {
std::cout << "Are equal.";
}
else {
std::cout << "Are not equal.";
}
}
bool isEqual(int a, int b)
{
if((!(a < b)) && (!(b < a)))
return true;
return false
}
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";
}