【競プロ】配列を標準入力するときのテク?(参照渡しの範囲for文)

2024/05/21に公開

結論

入力が以下のように与えられているとき、

\begin{matrix} N \\ A_1 & A_2 & \cdots & A_N \end{matrix}

このように書ける

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の値は変わりません
そのため、変数に&を付けて参照渡しにしてあげます

値渡しでは、aiaの要素をコピーしたローカル変数となっています

まとめ

個々で見ると見慣れた書き方ですが、組み合わせるとこんな書き方があるのかと感動しました!

Discussion