pair/tuple(C++)
- 2019.08.19
- 競プロ
pair
・2つの値の組を表す
・pair<値1の型, 値2の型> 変数名; で宣言
・変数名.firstで1番目の値、変数名.secondで2番目の値にアクセスできる
・make_pair(値1, 値2)でpairを生成できる
・tie(変数1, 変数2) = pair型の値; でpairを分解できる
tuple
・pairを一般化したもの。複数個の値の組を表す
・tuple<値1の型, 値2の型, 値3の型, (...)> 変数名;(必要な分だけ型を書く)で宣言
・make_tuple(値1, 値2, 値3, (…))でtupleを生成することができる
・tie(変数1, 変数2, 変数3, (…)) = tuple型の値;でtupleを分解することができる
(参考:https://atcoder.jp/contests/apg4b/tasks/APG4b_z)
→全部tupleで書けば良い?
tuple例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
#include <bits/stdc++.h> using namespace std; int main() { tuple<int, string, bool> data(1, "hello", true); get<2>(data) = false; //get<K>(tuple型の変数)で、K(定数)番目にアクセス。Kは0から始まる! cout << get<1>(data) << endl; // hello data = make_tuple(2, "WORLD", true); int a; string s; bool f; tie(a, s, f) = data; cout << a << " " << s << " " << f << endl; // 2 WORLD 1 } |
比較・ソート
型が同じpairやtuple同士は比較できる
例えばpair
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
#include <bits/stdc++.h> using namespace std; int main() { vector<tuple<int, int, int>> a; a.push_back(make_tuple(3, 1, 1)); a.push_back(make_tuple(1, 2, 100)); a.push_back(make_tuple(3, 5, 1)); a.push_back(make_tuple(1, 2, 3)); sort(a.begin(), a.end()); for (tuple<int, int, int> t : a) { int x, y, z; tie(x, y, z) = t; cout << x << " " << y << " " << z << endl; } } //実行結果 //1番目の値で昇順にソートされた後に、2番目の値で昇順でソートされてる。以下同様 1 2 3 1 2 100 3 1 1 3 5 1 |
AtCoder該当問題
・ABC182b
tupleを使った解法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
#include <bits/stdc++.h> using namespace std; int main(){ int n, p; string s; cin >> n; tuple<string, int, int>r[110]; for(int i=0;i<n;i++){ cin >> s >> p; r[i]=make_tuple(s,-p,i+1); //2番目は降順でソートするため、あらかじめマイナスをつけておく } for(int i=0;i<n;i++){ sort(r, r+n); cout << get<2>(r[i]) << endl; } } |
-
前の記事
二次元配列(C++) 2019.08.18
-
次の記事
CRBSI(カテーテル関連血流感染症) 2019.08.22