C++競プロ学習日記(仮)

( 学習記録であり解説Blogではないです )

std::tuple|C++

std::tuple の使い方を覚えたのでメモします。

std::tuple とは?
std::pair2 つの型の値を保持出来るのに対し、std::tupleN 個の型の値を保持する事ができる。*1


宣言・要素格納:

//宣言
vector<tuple<int, string, bool>> vc;
for( int i = 0; i < 3; ++i )
{
    string a;
    bool b;
    cin >> a >> b;
    //要素構築
    vc.emplace_back( i, a, b );
}

格納する値が全部 int の場合 vector<tuple<int, int, int>> vc; となる。
値の型が異なる場合は vector<tuple<int, string, bool>> vc; とできる。
要素構築(格納)は std::emplace_back などを使ってできる。


要素の取得

std::tuple::get *2 を使って各要素を取得できる。

for( auto x : vc )
{
    //位置を指定する場合(I番目の引数)
    cout << get<0>( x ) << " " << get<1>( x ) << " " << get<2>( x ) << endl;
}

⬆ I 番目の引数を指定する事で要素を取得できる。( tuple<0番目, 1番目, 2番目> の順 )

for( auto x : vc )
{
    //型を指定する場合
    cout << get<bool>( x ) << " " << get<string>( x ) << " " << get<int>( x ) << endl;
}

⬆引数の代わりに型を入れると、その型の要素が取得できる。

for( int i = 0; i < 3; ++i )
{
    //添字も使える
    cout << get<0>( vc[ i ] ) << " " << get<1>( vc[ i ] ) << " " << get<2>( vc[ i ] ) << endl;
}

⬆ range-based for でなく普通の for 文 + 添字 で要素の取得もできる。


要素をソート

sort( begin( vc ), end( vc ) );

⬆ sort した場合、tuple の第一要素、第二要素、第三要素の順で比較した結果が返ります。*3

sort( begin( vc ), end( vc ), greater<tuple<int, string, bool>>() );

⬆ 降順 sort は第三引数に greater<tuple<int, string, bool>>() を指定します。

sort( ALL( vc ), []( const auto &x, const auto &y )
         {
             //第一要素が同一ならば第二要素の小さい方を返す
             return get<0>( x ) == get<0>( y ) ? get<1>( x ) < get<1>( y ) : get<0>( x ) > get<0>( y );
         });

std::sort の第三引数にラムダで各要素の比較結果を返せるようにも書けます。


型の要素数取得

//型の要素数取得
cout << tuple_size<tuple<int, string, bool, int, int>>::value << endl;

tuple 型としてみなせる型の要素数を取得してくれます。*4
この場合は int, string, bool, int, int なので 5 が出力される。
vector に格納された要素数が知りたい場合は vc.size() で普通に求まる。



実行コード:[Wandbox]三へ( へ՞ਊ ՞)へ ハッハッ
std::tuple 便利すぎる...。色々な問題で使ってみたい!