2017-10-20 200 views
2

我试图实现一个二叉搜索树,我需要一个函数告诉我一个元素是否已经存在于树中! 但是我唯一可以使用的运营商是<。 这甚至可能吗?查找两个变量是否等于只有小于运算符

我已经尝试过 和(a<b) || (b<a)!(a<b) && !(b<a)

注:我只允许使用<比较我的元素二叉树。

+1

你只能做两件事:'a David

+2

[运算符<和严格弱排序]的可能重复(https://stackoverflow.com/questions/979759/operator-and-strict-weak-ordering) –

+1

如果两个值中的任何一个都小于另一个,则它们必须是等于。 –

回答

4

你可以写在C++

not (a < b or b < a) 

,对于二叉搜索树的表达不会必需的,因为它通常是足够用了if_else之类的语句

相当于

not (a < b) and not (b < a) 

虽然

if (a < b) 
{ 
    // ... 
} 
else if (b < a) 
{ 
    //... 
} 
else /* a == b */ 
{ 
    //... 
} 
+0

这不能保证工作。看到我的答案。 – Xirema

+0

@Xirema没有必要确切地等于浮点数。 –

+0

它仍然不能保证为浮标工作。 'NaN'值可能导致'a Xirema

1

您要找的表情为:

!(a < b || b < a) 

即相当于:

!(a < b) && !(b < a) 

因为Boolean algebralogical 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."; 
    } 
} 
0

作为一个例子,你可以为ints这样做:

bool isEqual(int a, int b) 
{ 
    if((!(a < b)) && (!(b < a))) 
     return true; 
    return false 
} 

如果您无法使用甚至&&运营商,你可以嵌套的if语句。还有更多() s,这只是为了让评估顺序更加明显。

+0

假设提供的'operator <'返回'bool'是安全的。在这种情况下,您可以使用'operator &&',因为它已经很好地定义了'bool'。 –

3

无法保证,只给予operator<的执行,即a == b

这是因为存在一个所谓的“偏序”的概念,这可能,异常情况下,允许这样一个场景,两个物体可以有条件下令反目成仇。

作为示例,考虑描述类继承的图。我们可以定义以下规则:

  • A等于类B如果AB描述同一类。
  • AB类更大如果AB一个超类或是B或等类的超类的(从AB继承,或B继承CA继承等)类的超类
  • A小于B类如果AB一个子类(从BA继承,或从CB继承等A继承)
  • A不会相对于命令B类,如果它们没有相对于彼此(A不从B继承,并B不从A继承)
  • A不相对于有序B如果他们都来自同一个超类继承,但在其他方面没有关系(从CA继承,从CB继承)
  • A没有相对于责令B类,如果他们相互来自同一个子类继承,但在其他方面没有关系(来自AC继承和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 < bb < a既可以返回false。如果ab都是NaN,即使两个NaN值具有相同的有效负载,a == b也可以返回false!此外,这种关系是只保证整数在一个二进制补码表示,其中C++标准不需要

+0

真棒回答。详细解释我所困惑的一切。谢谢 – Siyavash

+0

@Siyavash然后把这个标记为真正的正确答案 – RH6

相关问题