名前空間
変種
操作

operator==,!=,<,<-,>,>=,<=> (std::tuple)

From cppreference.com
< cpp‎ | utility‎ | tuple
 
 
ユーティリティライブラリ
言語サポート
型のサポート (基本型、RTTI)
ライブラリ機能検査マクロ (C++20)
プログラムユーティリティ
可変引数関数
コルーチンサポート (C++20)
契約サポート (C++26)
三方比較
(C++20)
(C++20)(C++20)(C++20)  
(C++20)(C++20)(C++20)

汎用ユーティリティ
関係演算子 (C++20で非推奨)
 
 
ヘッダ <tuple> で定義
template< class... TTypes, class... UTypes >

bool operator==( const std::tuple<TTypes...>& lhs,

                 const std::tuple<UTypes...>& rhs );
(1) (C++11以降)
(C++14以降constexpr)
template< class... TTypes, class... UTypes >

bool operator!=( const std::tuple<TTypes...>& lhs,

                 const std::tuple<UTypes...>& rhs );
(2) (C++11以降)
(C++14以降constexpr)
(C++20まで)
template< class... TTypes, class... UTypes >

bool operator<( const std::tuple<TTypes...>& lhs,

                const std::tuple<UTypes...>& rhs );
(3) (C++11以降)
(C++14以降constexpr)
(C++20まで)
template< class... TTypes, class... UTypes >

bool operator<=( const std::tuple<TTypes...>& lhs,

                 const std::tuple<UTypes...>& rhs );
(4) (C++11以降)
(C++14以降constexpr)
(C++20まで)
template< class... TTypes, class... UTypes >

bool operator>( const std::tuple<TTypes...>& lhs,

                const std::tuple<UTypes...>& rhs );
(5) (C++11以降)
(C++14以降constexpr)
(C++20まで)
template< class... TTypes, class... UTypes >

bool operator>=( const std::tuple<TTypes...>& lhs,

                 const std::tuple<UTypes...>& rhs );
(6) (C++11以降)
(C++14以降constexpr)
(C++20まで)
template< class... TTypes, class... UTypes >

constexpr std::common_comparison_category_t<
    synth-three-way-result<TTypes, Elems>...>
    operator<=>( const std::tuple<TTypes...>& lhs,

                 const std::tuple<UTypes...>& rhs );
(7) (C++20以降)
template< class... TTypes, tuple-like UTuple >
constexpr bool operator==( const tuple<TTypes...>& lhs, const UTuple& rhs );
(8) (C++23から)
template< class... TTypes, tuple-like UTuple >

constexpr std::common_comparison_category_t<
    synth-three-way-result<TTypes, /* Elems */>...>

    operator<=>( const tuple<TTypes...>& lhs, const UTuple& rhs );
(9) (C++23から)
1,2) タプル lhs の各要素と、タプル rhs の対応する要素を operator== で比較します。
1) 対応する要素のすべてのペアが等しい場合、true を返します。
2) !(lhs == rhs) を返します。
sizeof...(TTypes)sizeof...(UTypes) と等しくない場合、または [0sizeof...(Types)) 内の任意の i について std::get<i>(lhs) == std::get<i>(rhs) が有効な式でない場合、プログラムは不正な形式です。
[0sizeof...(Types)) 内の任意の i について、std::get<i>(lhs) == std::get<i>(rhs) の型と値カテゴリが BooleanTestable の要件を満たさない場合、動作は未定義です。
(C++26まで)
このオーバーロードは、sizeof...(TTypes)sizeof...(UTypes) と等しく、std::get<i>(lhs) == std::get<i>(rhs) が有効な式であり、[0sizeof...(Types)) 内のすべての i について decltype(std::get<i>(lhs) == std::get<i>(rhs))boolean-testable をモデル化する場合にのみ、オーバーロード解決に参加します。
(C++26以降)
3-6) lhsrhsoperator< で辞書式に比較します。つまり、最初の要素を比較し、等価であれば2番目の要素を比較し、等価であれば3番目の要素を比較し、というように続きます。
3) 空のタプルの場合、false を返します。空でないタプルの場合、効果は次と等価です。
if (std::get<0>(lhs) < std::get<0>(rhs)) return true;

if (std::get<0>(rhs) < std::get<0>(lhs)) return false;
if (std::get<1>(lhs) < std::get<1>(rhs)) return true;
if (std::get<1>(rhs) < std::get<1>(lhs)) return false;
...

return std::get<N - 1>(lhs) < std::get<N - 1>(rhs);
4) !(rhs < lhs) を返します。
5) rhs < lhs を返します。
6) !(lhs < rhs) を返します。
sizeof...(TTypes)sizeof...(UTypes) と等しくない場合、または同等ステートメントに示されている比較式のいずれかが有効な式でない場合、プログラムは不正な形式です。
同等ステートメントに示されている比較式のいずれかの型と値カテゴリが BooleanTestable の要件を満たさない場合、動作は未定義です。
7) lhsrhssynth-three-way で辞書式に比較します。つまり、最初の要素を比較し、等価であれば2番目の要素を比較し、等価であれば3番目の要素を比較し、というように続きます。
  • 空のタプルの場合、std::strong_ordering::equal を返します。
  • 空でないタプルの場合、効果は次と等価です。

if (auto c = synth-three-way(std::get<0>(lhs), std::get<0>(rhs)); c != 0) return c;
if (auto c = synth-three-way(std::get<1>(lhs), std::get<1>(rhs)); c != 0) return c;
...
return synth-three-way(std::get<N - 1>(lhs), std::get<N - 1>(rhs));

8) (1) と同じですが、rhstuple-like オブジェクトであり、rhs の要素数は std::tuple_size_v<UTuple> によって決定される点が異なります。このオーバーロードは 引数依存の名前探索 (argument-dependent lookup) を介してのみ見つかります。
9) (7) と同じですが、rhstuple-like オブジェクトである点が異なります。/* Elems */ は、[0std::tuple_size_v<UTuple>) 内の各 i に対する型パック std::tuple_element_t<i, UTuple> を昇順に示します。このオーバーロードは 引数依存の名前探索 (argument-dependent lookup) を介してのみ見つかります。

すべての比較演算子は短絡評価されます。比較の結果を決定するために必要な範囲を超えてタプル要素にアクセスすることはありません。

<, <=, >, >=, != 演算子は、それぞれ operator<=>operator== から合成されます。

(C++20以降)

目次

[編集] パラメーター

lhs, rhs - 比較するタプル

[編集] 戻り値

1,8) [0sizeof...(Types)) 内のすべての i について std::get<i>(lhs) == std::get<i>(rhs) であれば true、そうでなければ false。2つの空のタプルの場合は true を返します。
2) !(lhs == rhs)
3) lhs の最初の非等価要素が rhs の要素より小さい場合 truerhs の最初の非等価要素が lhs の要素より小さい場合、または非等価要素がない場合 false。2つの空のタプルの場合、false を返します。
4) !(rhs < lhs)
5) rhs < lhs
6) !(lhs < rhs)
7,9) 最初の非等価要素のペアがあればその関係、そうでなければ std::strong_ordering::equal。2つの空のタプルの場合、std::strong_ordering::equal を返します。

[編集] 備考

関係演算子は、各要素の operator< を用いて定義されます。

(C++20まで)

関係演算子はsynth-three-wayを介して定義されます。synth-three-wayは、可能であればoperator<=>を使用し、そうでなければoperator<を使用します。

特に、要素の型が operator<=> を提供しない場合でも、3方向比較可能な型に暗黙的に変換できる場合は、operator< の代わりにその変換が使用されます。

(C++20以降)
機能テストマクロ 規格 機能
__cpp_lib_constrained_equality 202403L (C++26) std::tuple の制約付き operator==

[編集]

タプルには operator< が定義されているため、タプルのコンテナはソートできます。

#include <algorithm>
#include <iostream>
#include <tuple>
#include <vector>
 
int main()
{
    std::vector<std::tuple<int, std::string, float>> v
    {
        {2, "baz", -0.1},
        {2, "bar", 3.14},
        {1, "foo", 10.1},
        {2, "baz", -1.1},
    };
    std::sort(v.begin(), v.end());
 
    for (const auto& p: v)
        std::cout << "{ " << get<0>(p)
                  << ", " << get<1>(p)
                  << ", " << get<2>(p)
                  << " }\n";
}

出力

{ 1, foo, 10.1 }
{ 2, bar, 3.14 }
{ 2, baz, -1.1 }
{ 2, baz, -0.1 }

[編集] 欠陥報告

以下の動作変更を伴う欠陥報告が、以前に公開されたC++標準に遡って適用されました。

DR 適用対象 公開された動作 正しい動作
LWG 2114
(P2167R3)
C++11 ブール演算の型事前条件が不足していました 追加された

[編集] 関連項目

(C++20で削除)(C++20で削除)(C++20で削除)(C++20で削除)(C++20で削除)(C++20)
pair内の値を辞書式比較する
(関数テンプレート) [編集]
English 日本語 中文(简体) 中文(繁體)