如何重载C++太空船运算符(<=>)以实现逆序排序?
实现逆序排序的
operator<=> 你原来的写法错误在于,三路比较运算符(<=>)的返回值是枚举类型(比如std::strong_ordering),直接用!取反逻辑不成立,因为它不是布尔值。
有两种比switch-case更简洁的实现方式:
方法一:交换比较对象
直接将当前对象的i和右操作数的i交换位置进行比较,天然实现逆序:
struct Bar { auto operator<=> (const Bar& rhs) const { return rhs.i <=> i; } int i; };
比如比较Bar{1}和Bar{2}时,实际执行2 <=> 1,返回std::strong_ordering::greater,因此Bar{1} > Bar{2}的结果为true,符合逆序要求。
方法二:对原始比较结果取反
利用C++20三路比较类型支持的一元负运算符,直接反转比较结果:
#include <compare> struct Bar { auto operator<=> (const Bar& rhs) const { return -(i <=> rhs.i); } int i; };
-(i <=> rhs.i)会将greater转为less,less转为greater,equal保持不变,完美实现逆序逻辑。
这两种方法都无需枚举所有比较情况,代码简洁且符合C++20的语法规范。
内容的提问来源于stack exchange,提问作者Bin Yan
相关产品推荐
相关产品推荐

