首页 > 后端开发 > C++ > 正文

c++20怎么使用三向比较符(spaceship operator)_C++20新特性与比较操作符实战

穿越時空
发布: 2025-12-04 09:29:40
原创
489人浏览过
三向比较符<=>简化C++20中类型的比较操作,通过返回std::strong_ordering或std::partial_ordering自动生成==、!=、<、<=、>、>=,支持默认和手动实现,提升代码简洁性与可维护性。

c++20怎么使用三向比较符(spaceship operator)_c++20新特性与比较操作符实战

在C++20中,三向比较符(spaceship operator),即 <=>,是一个重要的新特性,它简化了类型的比较操作。通过一个操作符,编译器可以自动生成 ==!=<<=>>= 的逻辑,极大减少了样板代码。

什么是三向比较符

三向比较符返回一个比较类别类型,表示两个值之间的关系:

  • std::strong_ordering::less —— 左边小于右边
  • std::strong_ordering::equal —— 两边相等
  • std::strong_ordering::greater —— 左边大于右边

对于浮点数等场景,使用 std::partial_ordering,因为浮点存在 NaN,无法保证全序。

基本用法:为自定义类型启用 <=>

假设我们有一个表示二维点的结构体,想支持完整的比较功能:

立即学习C++免费学习笔记(深入)”;

#include <iostream>
#include <compare>

struct Point {
    int x, y;

    // 自动生成所有六种比较操作
    auto operator<=>(const Point&) const = default;
};
登录后复制

使用 = default 让编译器自动生成三向比较逻辑。字段按声明顺序逐个比较。

int main() {
    Point a{1, 2};
    Point b{1, 3};

    if (a < b) std::cout << "a < b\n";           // 输出
    if (a != b) std::cout << "a != b\n";         // 输出
    if (!(a == b)) std::cout << "a not equal b\n"; // 输出
}
登录后复制

手动实现 spaceship operator

如果需要自定义比较逻辑,比如优先比较 y 坐标:

Bardeen AI
Bardeen AI

使用AI自动执行人工任务

Bardeen AI 154
查看详情 Bardeen AI
auto operator<=>(const Point& other) const {
    if (auto cmp = y <=> other.y; cmp != 0)
        return cmp;
    return x <=> other.x;
}
登录后复制

这段代码先比较 y,如果不等直接返回结果;否则继续比较 x。利用了三向比较的结果可以直接判断是否为 0(即相等)。

与旧标准兼容和生成特定操作符

C++20 允许只定义 operator<=>,编译器会自动合成 == 和其他关系操作符。但如果你只想支持部分比较,也可以显式删除或禁用:

bool operator==(const Point&) const = default;  // 可单独控制
登录后复制

注意:虽然 <=> 能生成 ==,但显式写出 == 并设为 =default 通常性能更好,因为能避免逐字段三向比较,转而使用更高效的相等性判断。

实际应用场景建议

  • 用于值类型(如坐标、时间、金额)时特别有用
  • 在容器排序(如 std::setstd::map)中可减少错误
  • 配合 <=> 返回类型,可写通用比较函数

例如,在泛型代码中安全比较:

template <typename T>
void compare_and_print(const T& a, const T& b) {
    auto result = a <=> b;
    if (result < 0) std::cout << "a < b\n";
    else if (result == 0) std::cout << "a == b\n";
    else std::cout << "a > b\n";
}
登录后复制

基本上就这些。C++20 的 spaceship operator 让比较逻辑更简洁、安全、高效。合理使用默认生成和手动控制,能大幅提升代码可维护性。

以上就是c++++20怎么使用三向比较符(spaceship operator)_C++20新特性与比较操作符实战的详细内容,更多请关注php中文网其它相关文章!

c++速学教程(入门到精通)
c++速学教程(入门到精通)

c++怎么学习?c++怎么入门?c++在哪学?c++怎么学才快?不用担心,这里为大家提供了c++速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号