0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

🎄 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;
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?