34
17

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【競プロC++】個人的に愛用しているテンプレ10選

Last updated at Posted at 2025-12-05

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;
}

これも有名な奴ですね、imin(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というライブラリを使っています。

debug出力のスクショ

こんな感じでとてもきれいに出力してくれるし、配列のサイズが大きいときは自動的に省略もしてくれます。
画像はほんの一例ですが、ほかにもpairqueueとかも対応していて、本当に良いライブラリです。

導入を強くおすすめします!!

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セットで、初めから右、左、下、上を表しています。

(x,y)の上下左右の処理をする
// 四方向の(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にまとめる作業をしています。
興味がありましたら是非ご覧ください。

それでは、良い競プロライフを!

  1. APG4b AP4 - 付録4.ループの裏技repマクロ

34
17
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
34
17

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?