0. はじめに
皆さんこんにちは、e6nlaqです。
この記事は競プロ Advent Calendar 2025の6日目の記事です。
私は普段、競プロをする上で自作のテンプレを多用しているのですが、その中には我ながら特に便利なものもあり、コンテストの際はそれらを重宝しています。
今回は、そのような私が特に愛用しているテンプレを、私の主観に基づく便利度順に分けて10個ご紹介します。
C++23が導入された環境でコンパイルすることを前提とします(GCC 14,15など)。
自己責任でご自由にお使いください。
1. 殿堂入り(便利度★★★★★★)
1.1 型短縮
using ll = long long;
using ull = unsigned long long;
using ld = long double;
using pll = pair<ll, ll>;
using vll = vector<ll>;
template <typename Tp1, typename Tp2>
using unmap = unordered_map<Tp1, Tp2>;
template <typename Tp>
using unset = unordered_set<Tp>;
template <typename Tp>
using reverse_queue = priority_queue<Tp, vector<Tp>, greater<Tp>>;
template <typename T>
using vec2 = vector<vector<T>>;
ll, vllあたりはよくあるやつだけど、unmap, unsetはちょっと珍しいかも(個人的には結構お気に入り)。
結構な時短につながると思うので、ぜひ試してみてください。
1.2 repマクロとゆかいな仲間たち
#define rep(i, n) for (ll i = 0; i < (ll)(n); i++)
#define rrep(i, n) for (ll i = (n) - 1; i >= 0; i--)
#define irep(i, n) for (ll i = 1; i <= (ll)(n); i++)
#define arep(i, a, n) for (ll i = (a); i < (ll)(n); i++)
APG4bにも載った1あの有名なrepマクロです。
順番を逆さにしたり、初期値を指定できるやつも導入しています。
さっき紹介したllに依存しています。
可変長引数repマクロというのをどこかで見た気がするので、いつかそっちにするのもいいかもしれません。
1.3 all/rall
#define all(x) begin(x), end(x)
#define rall(x) rbegin(x), rend(x)
sort(all(vec))とかが出来るようになります。
rallを用いることで降順にもできます。
rangesの登場で若干出番が減ったかも?
1.4 chmin/chmax(concept対応)
template <typename T1, typename T2>
requires totally_ordered_with<T1, T2> && assignable_from<T1&, T2>
inline bool chmin(T1& i, const T2 j) noexcept {
if (i > j) {
i = j;
return true;
}
return false;
}
template <typename T1, typename T2>
requires totally_ordered_with<T1, T2> && assignable_from<T1&, T2>
inline bool chmax(T1& i, const T2 j) noexcept {
if (i < j) {
i = j;
return true;
}
return false;
}
これも有名な奴ですね、iをmin(i, j)だったりmax(i, j)で上書きします。
C++20で導入されたconceptを活用して、より安全に使えるようになっています。
2. 超愛用(便利度★★★★★)
2.1 co
inline void co() {
cout << endl;
}
template <typename Head, typename... Tail>
void co(Head head, Tail... tail) {
cout << head;
if constexpr (sizeof...(tail) > 0) {
cout << " ";
}
co(tail...);
}
Pythonのprintです。ガチで愛用してます。
用途は出力するだけですが、あの地味に長ったらしいcout << hoge << endl;を書かないで済むので結構な時短になります。
意外なことに、この類の関数を使っている人を見たことがないんですよね...
2.2 YesNo
inline void YesNo(bool b) noexcept {
cout << (b ? "Yes" : "No") << endl;
}
名前通り、Yes/Noを出力するだけのやつ。
地味だけど便利。ABCのA,B問題あたりでよく使います。
2.3 make_vec2
template <typename T>
inline vector<vector<T>> make_vec2(const size_t H, const size_t W, const T& init) {
return vector<vector<T>>(H, vector<T>(W, init));
}
template <typename T>
inline vector<vector<T>> make_vec2(const size_t H, const size_t W) {
return vector<vector<T>>(H, vector<T>(W));
}
2次元配列をサクッと作れるやつです。
2次元配列を作るのって地味に長くてだるいので重宝してます。
auto A = make_vec2<int>(H, W);
// 初期値も指定可
auto dp = make_vec2<int>(N + 1, 5, INF);
3次元verもよかったらどうぞ
3次元版コード(make_vec3)
make_vec2に依存してます。
template <typename T>
inline vector<vector<vector<T>>> make_vec3(const size_t X, const size_t Y, const size_t Z, const T& init) {
return vector<vector<vector<T>>>(X, make_vec2<T>(Y, Z, init));
}
template <typename T>
inline vector<vector<vector<T>>> make_vec3(const size_t X, const size_t Y, const size_t Z) {
return vector<vector<vector<T>>>(X, make_vec2<T>(Y, Z));
}
2.4 debug(番外編)
競プロでデバッグをする際は出力をすることが不可欠になると思うのですが、私はそれにcpp-dumpというライブラリを使っています。
こんな感じでとてもきれいに出力してくれるし、配列のサイズが大きいときは自動的に省略もしてくれます。
画像はほんの一例ですが、ほかにもpairやqueueとかも対応していて、本当に良いライブラリです。
導入を強くおすすめします!!
3. あると結構楽(便利度★★★★)
3.1 vectorのcin>>
template <typename T>
inline istream& operator>>(istream& is, vector<T>& v) {
#ifdef LOCAL
assert(v.size() != 0);
#endif
for(size_t i = 0; i < v.size(); ++i) {
is >> v[i];
}
return is;
}
これでcin >> vecとかが可能になります。
脳死で入力を受け取れるのでおすすめです。
LOCALマクロを定義しておくと、長さが0ときにエラーを吐いてくれます。
初期化忘れ予防です。
#define LOCAL
vector<int> A(5), B;
cin >> A;
// Error!
cin >> B;
3.2 dx/dy
constexpr array<int, 4> dx = {0, 0, 1, -1};
constexpr array<int, 4> dy = {1, -1, 0, 0};
グリッド系の問題で出てくる、上下左右の移動に使える配列です。普通に便利。
基本的に$(dx_i,dy_i)$で1セットで、初めから右、左、下、上を表しています。
// 四方向の(dx_i,dy_i)を(x,y)に足して、上下左右に移動した後の座標を計算する。
for(int i = 0; i < 4; ++i) {
int nx = x + dx[i];
int ny = y + dy[i];
// ======
// (nx,ny)に対する処理
// ======
}
4. 終わりに
今回は、私が重宝しているテンプレをご紹介しました。
皆さんの参考になれば嬉しいです。
余談ですが、今回紹介した以外のテンプレ(ライブラリ)を現在GitHubにまとめる作業をしています。
興味がありましたら是非ご覧ください。
それでは、良い競プロライフを!
