🎄 Qiita Advent Calendar 2024 🎄
この記事は,Qiita Advent Calendar 2024 の ひとりアドベントカレンダー by Hietan というカレンダーの3日目の記事です.
アウトプット力の強化を目的に,25日分すべて1人で書ききるというチャレンジをしています.是非他の記事もご覧ください.
はじめに
以下では,以下のコードを記載している前提で進めます.
#include <bits/stdc++.h>
using namespace std;
#define rep(i, n) for(int i = 0; i < (int)n; i++)
みなさんは,競技プログラミングをやっていますか?
競技プログラミングだと,速度の速さから C++ を使っている方も多いと思います.
ただ,配列の入出力のコーディング面倒じゃないですか?
Before
例えば,長さが n
の int 型 vector を作成し,データを標準入力から取得するとします.
標準ライブラリだと,次のような記述になります.
vector<int> arr(n);
for (int i = 0; i < n; i++) {
cin >> arr.at(i);
}
範囲 for 文を使うとこのようになります.
vector<int> arr(n);
for (int &e: arr) cin >> e;
いちいち for 文を書くのは面倒です.
特に範囲 for 文の場合,
for (int &e: arr) cin >> arr;
と書いてしまって,コンパイルエラーを起こすことがよくあります.
After
vector に対して cin
するだけで一括で標準入力ができるようにします.
以下の記述をテンプレートとして準備します.
template <typename T>
istream& operator>>(istream& is, vector<T>& v) {
for (T& e: v) is >> e;
return is;
}
vector 型に対する >>
演算子を定義しています.
これで必要なコードは以下の通りです.
vector<int> arr(n);
cin >> arr;
非常に直感的でスッキリしました.
出力についても同じようにできます.
template <typename T>
ostream& operator<<(ostream& os, V<T> v) {
rep(i, v.size() - 1) os << v.at(i) << ' ';
os << v.back() << endl;
return os;
}
末尾に空白を含めないために,最後の要素だけ別の処理にしています.
これを使う時は以下の通りです.
cout << arr;