繁体   English   中英

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

[英]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如果AB描述相同的类。
  • A比类更大B如果A是类的超类B或者是类的超类的类的超类B或等( B从继承A ,或B从继承C从继承A等)
  • A小于类B如果A是的一个子类BA从继承B ,或A从继承C从继承B等)
  • A类彼此没有关系,则A不按 B命令A不从B继承, B不从A继承)
  • 如果类A都继承自同一个超类,则它不是针对B 排序的 ,否则没有关系( A继承自CB继承自C
  • A类是从相同的子类相互继承的, 则不对 B类进行排序 ,否则它们没有关系( C继承自AB

考虑到以下功能,这使得它完全合理:

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 < bb < a都可以返回false。 如果ab都是NaNa == b也可以返回false,即使两个NaN值都具有相同的有效载荷! 此外,这种关系仅保证二进制补码表示中的整数,这是C ++标准不需要的

您正在寻找的表达方式是:

!(a < b || b < a)

这相当于:

!(a < b) && !(b < 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.";
    }
}

作为一个例证,可以用于做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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM