名前空間
変種
操作

std::compare_3way

提供: cppreference.com
< cpp‎ | algorithm
 
 
アルゴリズムライブラリ
実行ポリシー (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以上)

三方比較を使用して2つの値を比較し、適用可能な最も強い比較カテゴリ型の結果を生成します。

詳細は以下の通りです。

  • a <=> b が well-formed であれば、その結果を返します。
  • そうでなく、式 a == b および a < b がどちらも well-formed であって、 bool に変換可能であれば、
  • a == btrue と等しければ、 std::strong_ordering::equal を返します。
  • そうでなく、 a < btrue と等しければ、 std::strong_ordering::less を返します。
  • そうでなければ、 std::strong_ordering::greater を返します。
  • そうでなく、式 a == b が well-formed であって、 bool に変換可能 (しかし a < b はそうでない) であれば、
  • a == btrue と等しければ、 std::strong_equality::equal を返します。
  • そうでなければ、 std::strong_equality::nonequal を返します。
  • そうでなければ (a <=> ba == b がどちらも well-formed でない)、関数は削除されたものとして定義されます。

目次

[編集] 引数

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(a,b)); // 動作します。
}

出力:

less
greater
greater

[編集] 関連項目

三方比較を使用して2つの範囲を比較します
(関数テンプレート) [edit]
等しい、等しくないのみサポートする代用可能な三方比較の結果の型
(クラス) [edit]
等しい、等しくないのみサポートする代用可能でない三方比較の結果の型
(クラス) [edit]
6種類の演算子をすべてサポートする代用可能な三方比較の結果の型
(クラス) [edit]
6種類の演算子をすべてサポートする代用可能でない三方比較の結果の型
(クラス) [edit]
6種類の演算子をすべてサポートし、代用可能でなく、比較不可能な値を許容する、三方比較の結果の型
(クラス) [edit]