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

简介: 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 <iostream>
#include <compare>
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 <iostream>
#include <compare>
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 <iostream>
#include <compare>
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

相关文章
|
1月前
|
编译器 程序员 定位技术
C++ 20新特性之Concepts
在C++ 20之前,我们在编写泛型代码时,模板参数的约束往往通过复杂的SFINAE(Substitution Failure Is Not An Error)策略或繁琐的Traits类来实现。这不仅难以阅读,也非常容易出错,导致很多程序员在提及泛型编程时,总是心有余悸、脊背发凉。 在没有引入Concepts之前,我们只能依靠经验和技巧来解读编译器给出的错误信息,很容易陷入“类型迷路”。这就好比在没有GPS导航的年代,我们依靠复杂的地图和模糊的方向指示去一个陌生的地点,很容易迷路。而Concepts的引入,就像是给C++的模板系统安装了一个GPS导航仪
104 59
|
1月前
|
存储 编译器 C++
【C++】面向对象编程的三大特性:深入解析多态机制(三)
【C++】面向对象编程的三大特性:深入解析多态机制
|
1月前
|
存储 编译器 C++
【C++】面向对象编程的三大特性:深入解析多态机制(二)
【C++】面向对象编程的三大特性:深入解析多态机制
|
1月前
|
编译器 C++
【C++】面向对象编程的三大特性:深入解析多态机制(一)
【C++】面向对象编程的三大特性:深入解析多态机制
|
1月前
|
存储 安全 编译器
【C++】C++特性揭秘:引用与内联函数 | auto关键字与for循环 | 指针空值(一)
【C++】C++特性揭秘:引用与内联函数 | auto关键字与for循环 | 指针空值
|
27天前
|
C++
C++ 20新特性之结构化绑定
在C++ 20出现之前,当我们需要访问一个结构体或类的多个成员时,通常使用.或->操作符。对于复杂的数据结构,这种访问方式往往会显得冗长,也难以理解。C++ 20中引入的结构化绑定允许我们直接从一个聚合类型(比如:tuple、struct、class等)中提取出多个成员,并为它们分别命名。这一特性大大简化了对复杂数据结构的访问方式,使代码更加清晰、易读。
32 0
|
2月前
|
编译器 C++ 计算机视觉
C++ 11新特性之完美转发
C++ 11新特性之完美转发
49 4
|
2月前
|
Java C# C++
C++ 11新特性之语法甜点1
C++ 11新特性之语法甜点1
31 4
|
2月前
|
安全 程序员 编译器
C++ 11新特性之auto和decltype
C++ 11新特性之auto和decltype
38 3
|
2月前
|
设计模式 缓存 安全
C++ 11新特性之week_ptr
C++ 11新特性之week_ptr
35 2