Aizu Online Judge(AOJ)が提供している「プログラミング応用」(ITP2)の5_B問題をC++で解いてみました。
ITP2では、「プログラミングのための基礎ライブラリを獲得します」とあります。トピック#5では、「順列」というテーマで学びます。
問題(5_B: Sorting Tuples)
問題はリンク先をご覧ください。
AOJ ITP2 5_B問題: Sorting Tuples
3つ以上の異なる型の値を保持する tuple について学びます。
Tuple について
以下は、cpprefjp 様の記事を参考にさせていただきました。
tuple は、3つ以上の異なる型の値を保持することができます。以下のインターフェイス、ヘルパ関数が使えます。
名前 | 説明 |
get | tuple の i 番目の値を参照するインターフェイス |
make_tuple | tuple を構築するヘルパ関数 |
C++ プログラム例(ITP2 5_B)
tuple の値を vector の要素として格納して sort します。sort は、最初のメンバで sort した後に、次のメンバで sort することを繰り返します。結果的に、問題が要求している並び順になります。
4番目のメンバーは32ビット整数では足りないため、long long 型にしています。
tuple に関係するコードの背景色を変更しました。以下は、C++のプログラムです。
#include <iostream>
#include <tuple>
#include <vector>
#include <algorithm>
using namespace std;
int main()
{
int n;
cin >> n;
vector<tuple<int, int, char, long long int, string>> data(n);
for (int i = 0; i < n; ++i) {
int v;
int w;
char t;
long long int d;
string s;
cin >> v >> w >> t >> d >> s;
data[i] = make_tuple(v, w, t, d, s);
}
sort(data.begin(), data.end());
for (int i = 0; i < n; ++i) {
cout << get<0>(data[i]) << " "
<< get<1>(data[i]) << " "
<< get<2>(data[i]) << " "
<< get<3>(data[i]) << " "
<< get<4>(data[i]) << endl;
}
return 0;
}
上記プログラムは、AOJ で「AC(Accepted=正解)」と判定されました。
最後に
tuple は、pair と比較して見かけない印象です。必要な場合に使いこなしたいです。
引き続き、ITP2 の問題を紹介していきます。