C++20 三向比较:太空船运算符
学习operator<=>和std::compare_three_way,自动生成比较运算符。 · 难度:入门 · +15XP
三向比较简介
C++20引入了三向比较运算符operator<=>(称为太空船运算符),它返回一个比较类型,可同时表示小于、等于或大于。编译器可以自动生成所有比较运算符。
基本用法
#include <compare>
#include <iostream>
struct Point {
int x, y;
auto operator<=>(const Point&) const = default; // 自动生成所有比较
};
int main() {
Point a{1, 2}, b{1, 3};
std::cout << (a < b) << '
'; // true
std::cout << (a == b) << '
'; // false
std::cout << (a >= b) << '
'; // false
auto cmp = a <=> b;
if (cmp < 0) std::cout << "a小于b
";
else if (cmp == 0) std::cout << "相等
";
else std::cout << "a大于b
";
}
返回类型
| 类型 | 含义 |
|---|---|
std::strong_ordering | 全序,可替换(如整数) |
std::weak_ordering | 全序,不可替换(如大小写不敏感字符串) |
std::partial_ordering | 偏序,允许不可比较(如浮点数NaN) |
自定义比较
struct CaseInsensitiveString {
std::string s;
auto operator<=>(const CaseInsensitiveString& other) const {
// 自定义比较逻辑
auto cmp = std::lexicographical_compare_three_way(
s.begin(), s.end(), other.s.begin(), other.s.end(),
[](char a, char b) {
return std::toupper(a) <=> std::toupper(b);
});
return cmp;
}
bool operator==(const CaseInsensitiveString& other) const {
return *this <=> other == 0;
}
};练习提示
定义一个Student结构体,包含姓名和分数,实现三向比较运算符,优先按分数降序,然后按姓名升序。在main中创建vector并排序。