C++新特性 “太空飞船运算符“

本篇我们来介绍一下太空飞船运算符

太空飞船运算符的本质是三项比较运算符 "<=>"   意为两个操作数有三种比较结果  著名语言学家兰德尔发现这个符号像太空飞船游戏里面的操作符  所以起名字为太空飞船运算符

注意:三项比较运算符的返回结果只能与0或者是自身进行比较 不能与其他类型比较 否则会报错

三项赋值运算符的返回类型;

strong_ordering  表达的是strong含义 是一种可替代性

weak_ordering  表达的是weak的含义 表达是不可替代性

partial_ordering 

下面我来细细介绍:

std::strong_ordering

std::strong_ordering 类型有三种比较结果:

  1. std::strong_ordering::less:表示第一个操作数小于第二个操作数。
  2. std::strong_ordering::equal:表示两个操作数相等。
  3. std::strong_ordering::greater:表示第一个操作数大于第二个操作数。

std::weak_ordering

std::weak_ordering 类型是 C++20 中引入的另一种比较结果类型。它与 std::strong_ordering 类型类似,但在某些情况下允许模糊或不确定的比较结果。

std::weak_ordering 类型有三个可能的值:

  1. std::weak_ordering::less:表示第一个操作数小于第二个操作数。
  2. std::weak_ordering::equivalent:表示两个操作数相等或无法确定它们之间的大小关系。
  3. std::weak_ordering::greater:表示第一个操作数大于第二个操作数。

std::weak_ordering 类型适用于那些存在不可比较情况的比较运算,例如 NaN 和其他特殊浮点数值之间的比较。通过返回 std::weak_ordering 值,可以明确指示可能存在模糊或不

确定性的比较结果。

std::partial_order:

std::partial_order是一种三态比较结果类型,它有四个可能的值:

  1. std::partial_order::less:表示第一个操作数严格小于第二个操作数。
  2. std::partial_order::equivalent:表示两个操作数相等。
  3. std::partial_order::greater:表示第一个操作数严格大于第二个操作数。
  4. std::partial_order::unordered:表示两个操作数之间不存在确定的大小关系。

比较类型返回的数

1.partial_order 类型的比较结果通常与浮点数相关

2.strong_ordering 类型的比较结果通常与整数(int)相关  bool类型比较结果相关 指针比较相关

3.类型的比较结果通常与可比较类型相关。它用于表示有限序关系,即可以确定元素之间的大小关系,但不一定能确定严格的大小顺序

代码实例:

1.std::weak_ordering

#include 
#include 

int main() {
    int a = 5;
    int b = 10;

    std::weak_ordering result = a <=> b;

    if (result == std::weak_ordering::less)
        std::cout << "a is less than b" << std::endl;
    else if (result == std::weak_ordering::equivalent)
        std::cout << "a is equal to b" << std::endl;
    else if (result == std::weak_ordering::greater)
        std::cout << "a is greater than b" << std::endl;

    return 0;
}

2.std::partial_ordering

#include 
#include 

int main() {
    double a = 2.5;
    double b = 3.0;

    std::partial_ordering result = a <=> b;

    if (result == std::partial_ordering::less)
        std::cout << "a is less than b" << std::endl;
    else if (result == std::partial_ordering::equivalent)
        std::cout << "a is equal to b" << std::endl;
    else if (result == std::partial_ordering::greater)
        std::cout << "a is greater than b" << std::endl;
    else
        std::cout << "a and b are unordered" << std::endl;

    return 0;
}

 3.std::strong_ordering

#include 
#include 

struct MyClass {
    int value;

    // 自定义的比较函数
    auto operator<=>(const MyClass& other) const {
        return value <=> other.value;
    }
};

int main() {
   MyClass obj1{5};
   MyClass obj2{10};

   std::strong_ordering result = obj1 <=> obj2;

   if (result == std::strong_ordering::less)
       std::cout << "obj1 is less than obj2" << std::endl;
   else if (result == std::strong_ordering::equal)
       std::cout << "obj1 is equal to obj2" << std::endl;
   else if (result == std::strong_ordering::greater)
       std::cout << "obj1 is greater than obj2" << std::endl;

   return 0;
}

总结:使用“太空飞船运算符” 编译器会帮我们自动生成< <= > >=运算符 但是不生成==运算符 因为==运算符的效率不是很好 如果真的要实现 推荐使用C++的operator对运算符重载 从而进行<=>的自动化 智能化实现

好了 本篇就到这里了 在这里 小编想给大家推荐一个课程:

https://xxetb.xetslk.com/s/2PjJ3T

你可能感兴趣的:(C++,新特性,c++)