⏩
【競プロ】配列を標準入力するときのテク?(参照渡しの範囲for文)
結論
入力が以下のように与えられているとき、
このように書ける
int n; cin>>n;
vector<int> a(n);
// for(int i=0; i<(int)a.size(); i++) cin>>a[i]; と同等
for(auto &ai:a) cin>>ai;
短い!
解説
vectorを要素数で初期化
vector<int> a(n);
これをすることで、a[0]
~a[n-1]
にアクセスすることができます
初期値は不定ですが、後で標準入力するので問題ないです
vectorは初期化しないと代入時に怒られます
autoと範囲for文
for(auto ai:a) cin>>ai;
for(int ai:a)
と書くと、a
のすべての要素ai
でループを回すことができます
a[i]
のようにインデックスを使わずに書くことができます
また、範囲for文では実際の型の代わりに型推論のauto
が良く使われます
参照渡し&
for(auto &ai:a) cin>>ai;
先ほどのfor文だと実は値渡しになっておりa
の値は変わりません
そのため、変数に&
を付けて参照渡しにしてあげます
値渡しでは、ai
はa
の要素をコピーしたローカル変数となっています
まとめ
個々で見ると見慣れた書き方ですが、組み合わせるとこんな書き方があるのかと感動しました!
Discussion