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

相关文章
|
5月前
|
编译器 C++ 容器
【c++11】c++11新特性(上)(列表初始化、右值引用和移动语义、类的新默认成员函数、lambda表达式)
C++11为C++带来了革命性变化,引入了列表初始化、右值引用、移动语义、类的新默认成员函数和lambda表达式等特性。列表初始化统一了对象初始化方式,initializer_list简化了容器多元素初始化;右值引用和移动语义优化了资源管理,减少拷贝开销;类新增移动构造和移动赋值函数提升性能;lambda表达式提供匿名函数对象,增强代码简洁性和灵活性。这些特性共同推动了现代C++编程的发展,提升了开发效率与程序性能。
175 12
|
11月前
|
编译器 程序员 定位技术
C++ 20新特性之Concepts
在C++ 20之前,我们在编写泛型代码时,模板参数的约束往往通过复杂的SFINAE(Substitution Failure Is Not An Error)策略或繁琐的Traits类来实现。这不仅难以阅读,也非常容易出错,导致很多程序员在提及泛型编程时,总是心有余悸、脊背发凉。 在没有引入Concepts之前,我们只能依靠经验和技巧来解读编译器给出的错误信息,很容易陷入“类型迷路”。这就好比在没有GPS导航的年代,我们依靠复杂的地图和模糊的方向指示去一个陌生的地点,很容易迷路。而Concepts的引入,就像是给C++的模板系统安装了一个GPS导航仪
305 59
|
10月前
|
安全 编译器 C++
【C++11】新特性
`C++11`是2011年发布的`C++`重要版本,引入了约140个新特性和600个缺陷修复。其中,列表初始化(List Initialization)提供了一种更统一、更灵活和更安全的初始化方式,支持内置类型和满足特定条件的自定义类型。此外,`C++11`还引入了`auto`关键字用于自动类型推导,简化了复杂类型的声明,提高了代码的可读性和可维护性。`decltype`则用于根据表达式推导类型,增强了编译时类型检查的能力,特别适用于模板和泛型编程。
112 2
|
11月前
|
存储 编译器 C++
【C++】面向对象编程的三大特性:深入解析多态机制(三)
【C++】面向对象编程的三大特性:深入解析多态机制
112 1
|
11月前
|
存储 编译器 C++
【C++】面向对象编程的三大特性:深入解析多态机制(二)
【C++】面向对象编程的三大特性:深入解析多态机制
|
11月前
|
编译器 C++
【C++】面向对象编程的三大特性:深入解析多态机制(一)
【C++】面向对象编程的三大特性:深入解析多态机制
125 1
|
11月前
|
存储 安全 编译器
【C++】C++特性揭秘:引用与内联函数 | auto关键字与for循环 | 指针空值(一)
【C++】C++特性揭秘:引用与内联函数 | auto关键字与for循环 | 指针空值
161 1
|
12月前
|
编译器 C++ 计算机视觉
C++ 11新特性之完美转发
C++ 11新特性之完美转发
166 5
|
12月前
|
Java C# C++
C++ 11新特性之语法甜点1
C++ 11新特性之语法甜点1
89 5
|
12月前
|
编译器 C++ 容器
C++ 11新特性之语法甜点2
C++ 11新特性之语法甜点2
78 1