std::compare_3way

来自cppreference.com
< cpp‎ | algorithm
 
 
算法库
有制约算法及范围上的算法 (C++20)
概念与工具std::Sortable, std::projected, ...
有制约算法std::ranges::copy, std::ranges::sort, ...
执行策略 (C++17)
不修改序列的操作
(C++11)(C++11)(C++11)
(C++17)
修改序列的操作
未初始化存储上的操作
划分操作
排序操作
(C++11)
二分搜索操作
集合操作(在已排序范围上)
堆操作
(C++11)
最小/最大操作
(C++11)
(C++17)
compare_3way
(C++20)
排列
数值运算
C 库
 
定义于头文件 <algorithm>
template< class T, class U >
constexpr auto compare_3way( const T& a, const U& b );
(C++20 起)

用三路比较比较二个值,并产生最强的可应用比较类别类型。

详细而言:

  • 若表达式 a <=> b 为良式,则返回其结果
  • 否则,若表达式 a == ba < b 均为良式且可转换为 bool ,则
  • a == b 等于 true ,则返回 std::strong_ordering::equal
  • 否则,若 a < b 等于 true ,则返回 std::strong_ordering::less
  • 否则,返回 std::strong_ordering::greater
  • 否则,若表达式 a == b 为良式且可转换为 bool (但 a < b 非如此),则
  • a == b 等于 true ,则返回 std::strong_equality::equal
  • 否则,返回 std::strong_equality::nonequal
  • 否则(若 a <=> ba == b 均非良式),则定义函数为被删除。

目录

[编辑] 参数

a, b - 要比较的值

[编辑] 返回值

上述值。

[编辑] 注意

此函数在泛型编程中有用,因为它在 <=> 不可用时以 <== 为后备。

[编辑] 示例

#include <iostream>
#include <compare>
#include <algorithm>
 
// 不支持 <=>
struct Rational_1 {
    int num;
    int den; // > 0
};
 
inline constexpr bool operator<(Rational_1 lhs, Rational_1 rhs)
{
    return lhs.num * rhs.den < rhs.num * lhs.den;
}
 
inline constexpr bool operator==(Rational_1 lhs, Rational_1 rhs)
{
    return lhs.num * rhs.den == rhs.num * lhs.den;
}
 
// 支持 <=>
struct Rational_2 {
    int num;
    int den; // > 0
};
 
inline constexpr std::weak_ordering operator<=>(Rational_2 lhs, Rational_2 rhs)
{
    return lhs.num * rhs.den <=> rhs.num * lhs.den;
}
 
void print(std::weak_ordering value)
{
    if (value == 0)
        std::cout << "equal";
    else if (value < 0)
        std::cout << "less";
    else
        std::cout << "greater";
    std::cout << "\n";
}
 
int main()
{
    Rational_1 a{1, 2};
    Rational_1 b{3, 4};
//  print(a <=> b);                // 不工作
    print(std::compare_3way(a, b)); // 工作,默认到 < 和 ==
 
    Rational_2 c{6, 5};
    Rational_2 d{8, 7};
    print(c <=> d);                // 工作
    print(std::compare_3way(c, d)); // 工作
}

输出:

less
greater
greater

[编辑] 参阅

用三路比较比较两个范围
(函数模板) [编辑]
三路比较的结果类型,仅支持相等/不相等,且可替换
(类) [编辑]
三路比较的结果类型,仅支持相等/不相等,且不可替换
(类) [编辑]
三路比较的结果类型,支持所有 6 种运算符且可替换
(类) [编辑]
三路比较的结果类型,支持所有 6 种运算符且不可替换
(类) [编辑]
三路比较的结果类型,支持所有 6 种运算符,不可替换,并允许不可比较的值
(类) [编辑]