代码之家  ›  专栏  ›  技术社区  ›  Siyavash

查找两个变量是否仅用小于运算符相等

  •  2
  • Siyavash  · 技术社区  · 8 年前

    我正在尝试实现一个二叉搜索树,我需要一个函数来告诉我树中是否已经存在一个元素! 然而,我唯一可以使用的运算符是 < . 这可能吗?

    我已经有了 尝试 (a<b) || (b<a) !(a<b) && !(b<a)

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

    4 回复  |  直到 8 年前
        1
  •  4
  •   Vlad from Moscow    8 年前

    你可以用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 */
    {
        //...
    }
    
        2
  •  3
  •   Xirema    8 年前

    您无法保证,因为只有 operator< 那个 a == b

    这是因为存在一个称为“偏序”的概念,在异常情况下,这可能允许出现两个对象可以同时存在的情况 有条件地 相互命令。

    以一个描述类继承的图为例。我们可以定义以下规则:

    • A 等于类 B 如果 B 描述同一类。
    • A. 大于类 如果 是的超类 B 或者是 等等( B 继承自 A. B 继承自 C A. 等)
    • A. 小于类 B 如果 A. 是的子类 B A. B A. 继承自 继承自 B 等)
    • A. 未针对订购 B 如果他们彼此没有关系( A. 不从继承 B B 不从继承 A. )
    • A. 未针对订购 B 如果它们都继承自同一个超类,但在其他方面没有关系( A. 继承自 C , B 继承自 )
    • 未针对订购 B 如果它们是从同一子类相互继承的,但在其他方面没有关系( C 从两者继承 A. )

    鉴于以下功能,这使得完全合理:

    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。

    但您确实需要一些机制来确保用户不会试图将偏序键传递给比较函数。否则,你就需要一个完整的 操作员== 实施

    在有人插嘴说“算术类型呢?”,之前,我要提醒你 NaN 存在符合IEEE的浮点值,其中 a < b b < a 两者都可以返回false。 a==b a b 值具有相同的有效负载!此外,这种关系是 仅保证 对于二元互补表示中的整数 C++标准不需要 .

        3
  •  1
  •   Ron Alan    8 年前

    !(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.";
        }
    }
    
        4
  •  0
  •   Honza Dejdar    8 年前

    举个例子,你可以为 ints 这样地:

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

    如果你甚至不能使用 && 运算符,您可以嵌套if语句。还有更多 ()