全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

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

三向比较符简化C++20中类型的比较操作,通过返回std::strong_ordering或std::partial_ordering自动生成==、!=、=,支持默认和手动实现,提升代码简洁性与可维护性。

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

什么是三向比较符

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

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

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

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

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

#include 
#include 

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 坐标:

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 
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 让比较逻辑更简洁、安全、高效。合理使用默认生成和手动控制,能大幅提升代码可维护性。


# ai  # c++  # ios  # stream  # less  # 结构体  # 值类型  # operator  # 泛型  # map  # default  # 自动生成  # 自定义  # 是一个  # 如果你  # 浮点  # 设为  # 这段  # 可以直接  # 只想  # 六种 


相关文章: 如何在云虚拟主机上快速搭建个人网站?  如何选择可靠的免备案建站服务器?  建站主机类型有哪些?如何正确选型  如何使用Golang table-driven基准测试_多组数据测量函数效率  建站之星IIS配置教程:代码生成技巧与站点搭建指南  如何零成本快速生成个人自助网站?  网站制作公司,橙子建站是合法的吗?  建站之星伪静态规则如何设置?  如何在阿里云虚拟主机上快速搭建个人网站?  免费制作统计图的网站有哪些,如何看待现如今年轻人买房难的情况?  关于BootStrap modal 在IOS9中不能弹出的解决方法(IOS 9 bootstrap modal ios 9 noticework)  Android自定义listview布局实现上拉加载下拉刷新功能  广州网站设计制作一条龙,广州巨网网络科技有限公司是干什么的?  测试制作网站有哪些,测试性取向的权威测试或者网站?  网站制作的方法有哪些,如何将自己制作的网站发布到网上?  国美网站制作流程,国美电器蒸汽鍋怎么用官方网站?  如何配置IIS站点权限与局域网访问?  建站之星与建站宝盒如何选择最佳方案?  黑客入侵网站服务器的常见手法有哪些?  如何通过IIS搭建网站并配置访问权限?  山东云建站价格为何差异显著?  高端云建站费用究竟需要多少预算?  儿童网站界面设计图片,中国少年儿童教育网站-怎么去注册?  网站制作与设计教程,如何制作一个企业网站,建设网站的基本步骤有哪些?  如何生成腾讯云建站专用兑换码?  如何快速上传自定义模板至建站之星?  网站制作公司哪里好做,成都网站制作公司哪家做得比较好,更正规?  建站主机选购指南:核心配置优化与品牌推荐方案  佛山企业网站制作公司有哪些,沟通100网上服务官网?  怎么用手机制作网站链接,dw怎么把手机适应页面变成网页?  定制建站平台哪家好?企业官网搭建与快速建站方案推荐  如何做静态网页,sublimetext3.0制作静态网页?  广州建站公司哪家好?十大优质服务商推荐  小捣蛋自助建站系统:数据分析与安全设置双核驱动网站优化  网站制作公司排行榜,抖音怎样做个人官方网站  北京网站制作公司哪家好一点,北京租房网站有哪些?  C#如何在一个XML文件中查找并替换文本内容  建站之星如何修改网站生成路径?  设计网站制作公司有哪些,制作网页教程?  php json中文编码为null的解决办法  如何获取免费开源的自助建站系统源码?  如何用PHP快速搭建高效网站?分步指南  哈尔滨网站建设策划,哈尔滨电工证查询网站?  如何在宝塔面板中修改默认建站目录?  文字头像制作网站推荐软件,醒图能自动配文字吗?  建站主机空间推荐 高性价比配置与快速部署方案解析  如何制作新型网站程序文件,新型止水鱼鳞网要拆除吗?  浅析上传头像示例及其注意事项  非常酷的网站设计制作软件,酷培ai教育官方网站?  如何在建站之星网店版论坛获取技术支持? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。