本篇我们来介绍一下太空飞船运算符
太空飞船运算符的本质是三项比较运算符 "<=>" 意为两个操作数有三种比较结果 著名语言学家兰德尔发现这个符号像太空飞船游戏里面的操作符 所以起名字为太空飞船运算符
注意:三项比较运算符的返回结果只能与0或者是自身进行比较 不能与其他类型比较 否则会报错
三项赋值运算符的返回类型;
strong_ordering 表达的是strong含义 是一种可替代性
weak_ordering 表达的是weak的含义 表达是不可替代性
partial_ordering
下面我来细细介绍:
std::strong_ordering :
std::strong_ordering 类型有三种比较结果:
- std::strong_ordering::less:表示第一个操作数小于第二个操作数。
- std::strong_ordering::equal:表示两个操作数相等。
- std::strong_ordering::greater:表示第一个操作数大于第二个操作数。
std::weak_ordering :
std::weak_ordering 类型是 C++20 中引入的另一种比较结果类型。它与 std::strong_ordering 类型类似,但在某些情况下允许模糊或不确定的比较结果。
std::weak_ordering 类型有三个可能的值:
- std::weak_ordering::less:表示第一个操作数小于第二个操作数。
- std::weak_ordering::equivalent:表示两个操作数相等或无法确定它们之间的大小关系。
- std::weak_ordering::greater:表示第一个操作数大于第二个操作数。
std::weak_ordering 类型适用于那些存在不可比较情况的比较运算,例如 NaN 和其他特殊浮点数值之间的比较。通过返回 std::weak_ordering 值,可以明确指示可能存在模糊或不
确定性的比较结果。
std::partial_order:
std::partial_order是一种三态比较结果类型,它有四个可能的值:
- std::partial_order::less:表示第一个操作数严格小于第二个操作数。
- std::partial_order::equivalent:表示两个操作数相等。
- std::partial_order::greater:表示第一个操作数严格大于第二个操作数。
- 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对运算符重载 从而进行<=>的自动化 智能化实现
好了 本篇就到这里了 在这里 小编想给大家推荐一个课程: