std::tuple の使い方|C++
std::tuple の使い方を覚えたのでメモします。
std::tuple とは?
std::pair が 2 つの型の値を保持出来るのに対し、std::tuple は N 個の型の値を保持する事ができる。*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 の第三引数にラムダで各要素の比較結果を返せるようにも書けます。