概要
こんにちは👋環境構築が好きな6年目のWebアプリ開発をしている中堅エンジニアです。
最近AtCoderにハマっています。学んだアルゴリズムを使用して問題を解いて、テストケースをすべてACになった瞬間はとても気持ちよいです!
レートを高めるために現在進行形で精進しています。
AtCoderを始めるにあたり、もちろん環境構築は必要です。
ただ、初心者には環境構築をするだけでもとても敷居が高いです。
- どうやって環境構築するの?
- どのバージョンのコンパイラを使えばいいの?
- リンターやフォーマッタの設定方法がわからない
- Windows/Mac/Linuxで環境が違うと困る
補足:リンターとフォーマッタとは?
- リンター:コードを書いているときに、エラーや警告を事前に教えてくれる機能です。例えば、型の不一致や未使用の変数などを実行前に発見できます。
- フォーマッタ:コードの見た目を自動的に整えてくれる機能です。保存時に自動的にインデントやスペースを調整し、読みやすいコードに整形してくれます。
このような悩みを解決するために、すぐに使える開発環境テンプレートを作成しました。
この記事では、AtCoderでC++を使った競技プログラミングを快適に行うための開発環境テンプレートを紹介します。
このテンプレートは、リンター、フォーマッタ、デバッグ機能を利用できる環境をDockerという同じ環境を再現できるツールで環境を統一することで、ケアレスミスを大幅に減らし、コードの品質を向上させることができます。
補足:Dockerとは?
Dockerは、開発環境を「コンテナ」という箱に入れて、どこでも同じ環境を再現できるようにする技術です。
主な特徴
✅ コンパイル前にエラーや警告を表示するリンター機能
✅ 保存時に自動的にコードを整形するフォーマッタ機能
✅ ブレークポイントで変数を確認できるデバッグ機能
✅ Windows/Mac/Linuxで同じ環境を再現できるDocker対応
✅ AtCoder Library (ACL)や便利なツール(atcoder-cli、atcs)が含まれている
対象
あまりプログラミング言語のこと知らないけど、競プロってかっこいいから始めたい!けどどう環境構築したらいいのと思っている方。
とりあえず環境構築して問題を解いたけど、ケアレスミスたくさん…
どうやらリントやフォーマッタで見通しがよくなるみたいだけどセットアップの方法がよくわからんという方
もうテンプレートでいいから早く始めれない?と思っている方
GitHubページ
なぜこのテンプレートがいいか
競プロを始めるとき、多くの方が「とりあえず環境構築して問題を解いたけど、ケアレスミスたくさん…」という経験をします。
例えば、こんな経験はありませんか?
- 急いで書いたせいで、改行せずに1行で書いて、後から見直すのが大変だった
- 試行錯誤の中で、途中で使わなくなる変数が出てきた
- 間違った型を使っていることに実行してから気づいた
このテンプレートは、そんな悩みを解決するために作られました。
1. 間違いを事前に教えてくれる「リンター」機能
リンターとは、コードを書いているときに「ここ、間違ってるよ!」と教えてくれる機能です。
例えば、こんなことができます:
- 型の不一致(int型の変数に文字列を入れようとしている)
- 未使用の変数(宣言したけど使ってない変数)
- コンパイルエラーになる箇所
通常、こういった間違いは実行してみないと分かりません。でも、リンターがあれば実行する前からエディタ上で波線で警告してくれます。
このテンプレートでは、MicrosoftのC/C++拡張機能よりも高機能なclangdというリンターを使用しています。より正確で詳細な警告を表示してくれます。
(上記はclangdですべての警告を表示した場合です。実際には競プロ用に合わせた警告のみ表示するように最適化しています。)
2. コードを自動で綺麗にしてくれる「フォーマッタ」機能
フォーマッタとは、コードの見た目を自動で整えてくれる機能です。
例えば、こんなコードを書いたとします:
int main() {
for(int i=1;i<=10;i++){if(i%2==0){cout<<i<<" は偶数です"<<endl;}else{cout<<i<<" は奇数です"<<endl;}}
}
保存すると、自動的にこんな風に整形されます:
int main() {
for (int i = 1; i <= 10; i++) {
if (i % 2 == 0) {
cout << i << " は偶数です" << endl;
} else {
cout << i << " は奇数です" << endl;
}
}
}
人が読みやすい形に自動でフォーマットしてくれます。
ただし、競プロでは、型の省略や便利なマクロや関数などの事前に用意したテンプレートをフォーマットしたくないという場合もあります。
typedef long long int ll;
typedef long double ld;
…
#define il inline
#define rep(i, n) for (int i = 0; i < (int)(n); i++)
#define repn(i, num, n) for (int i = num; i < n; i++)
…
void yes(bool a){cout<<(a?"yes":"no")<<endl;}
void YES(bool a){cout<<(a?"YES":"NO")<<endl;}
void Yes(bool a){cout<<(a?"Yes":"No")<<endl;}
void possible(bool a){ cout<<(a?"possible":"impossible")<<endl; }
void Possible(bool a){ cout<<(a?"Possible":"Impossible")<<endl; }
void POSSIBLE(bool a){ cout<<(a?"POSSIBLE":"IMPOSSIBLE")<<endl; }
void fast_io() {std::ios::sync_with_stdio(false);std::cin.tie(NULL);}
…
// ↑はフォーマットしてほしくない
このテンプレートでは、// clang-format offと// clang-format onで囲むことで、テンプレート部分をフォーマットから除外できるようになっています。
3. バグを見つけやすくする「デバッグ」機能
通常の実行だと、プログラムが一気に実行されて結果だけが表示されます。
しかし、デバッグ機能を使えば、プログラムの途中で止めて「この時点での変数の値は何か?」を確認できます。
使い方:
- 行番号の左側をクリックしてブレークポイント(止めたい場所)を設定
-
F5キーを押す - ブレークポイントで止まったら、変数にマウスを乗せると値が表示されます
4. 環境の違いを気にしなくて良い「Docker」機能
Dockerとは、開発環境を「コンテナ」という箱に入れて、どこでも同じ環境を再現できるようにする技術です。
このテンプレートはDockerを使っているので:
- WindowsでもMacでもLinuxでも同じ環境が構築できます
- 既存のツールやアプリと競合しません(コンテナ内で完結するため)
- 一度設定すれば、誰でも同じ環境を再現できます
「WindowsPCで関係のないツールをインストールしていない競プロ専用のPCであること」なんて前提条件は不要です。
本テンプレートだと下記画像のような、「コンテナ」の中に各種ツール(コンパイラー、デバッグツール、言語サーバ)が入っておりコンテナ内でで環境が完結しているイメージです。
VS CodeのDev Containers拡張機能を使えば、コンテナ内で直接開発できるので、通常の開発とほとんど変わりません。
詳細は「Devcontainer ってなに? 実際につかってみる」や「VScodeのDevContainerってなんぞや」を参照してください。
5. 便利なサードパーティライブラリも含まれている
このテンプレートには、競プロをより快適にするためのサードパーティライブラリも含まれています。
- atcoder-cli (acc): コンテスト管理ツール。コンテスト用ディレクトリの作成や提出を自動化できます。詳細は公式インストールガイドを参照してください。
- atcs: AtCoder用のURLを指定して問題文を取得するシンプルなスクレイピングツール。復習目的での問題文をAIに読み込ませる際に便利なツールです。詳細は AtCoder シンプルなスクレイピングツール「atcs」の紹介 を参照してください。
まとめ
このテンプレートの特徴:
✅ リンター(clangd): コンパイル前にエラーや警告を表示
✅ フォーマッタ(clang-format): 保存時に自動的にコードを整形
✅ デバッグ機能(GDB): ブレークポイントで変数を確認
✅ Docker: 環境の統一性を保証
✅ サードパーティライブラリ: atcoder-cli、atcsなど便利なツールが含まれている
これらの機能により、「ローカルで書いてサンプル入力を実行して合ってたら提出」という基本的な流れは変わりませんが、その過程で発生するケアレスミスを大幅に減らすことができます。
環境要件
必須ソフトウェア
-
Docker Desktop (またはDocker Engine)
- Windows/Mac: Docker Desktop
- Linux: Docker Engine
- Visual Studio Code
-
Dev Containers拡張機能
- VS Code拡張機能マーケットプレイスからインストール
上記ツールは必須です。
セットアップ
1. リポジトリのクローン
git clone https://github.com/tomyou666/atcoder-template
cd AtCoder
2. VS Codeでプロジェクトを開く
code .
3. Dev Containerで開く
- VS Codeのコマンドパレットを開く(
Ctrl+Shift+P/Cmd+Shift+P) - 「Dev Containers: Reopen in Container」を選択
- 初回起動時は、Dockerイメージのビルドに数分かかります
4. 動作確認
コンテナが起動したら、動作確認をしてみましょう。
-
test.cppというファイルを作成して、以下のサンプルコードを書きます:
#include <iostream>
using namespace std;
int main() {
cout >> "Hello World" >> endl;
return 0;
}
-
Ctrl+Alt+N(Mac:Cmd+Alt+N)で実行します -
ターミナルに「Hello World」と表示されれば成功です!
プロジェクト構成
AtCoder/
├── .devcontainer/ # Dev Container設定
│ ├── Dockerfile # Dockerイメージ定義
│ └── devcontainer.json # コンテナ設定ファイル
├── .vscode/ # VS Code設定
│ ├── settings.json # エディタ設定
│ ├── launch.json # デバッグ設定
│ └── tasks.json # タスク設定
├── .clang-format # コードフォーマット設定
├── .clangd # clangd設定
├── template.cpp # C++テンプレートファイル
├── test.cpp # テスト用ファイル
├── module/ # 共通モジュール
│ └── algorithm.cpp # アルゴリズム実装例
└── README.md # このファイル
開発環境の詳細
インストール済みツール
コンパイラ・開発ツール
-
g++-13: GNU C++コンパイラ(C++23対応)※ 実行用 -
clang: LLVM C++コンパイラ ※ リント・補完する用 -
clangd: Language Server Protocol実装 -
gdb: デバッガー
ユーティリティ
-
zsh: Z Shell(デフォルトシェル) -
time: 実行時間測定 -
tree: ディレクトリ構造表示 -
git: バージョン管理 -
curl: HTTPクライアント
AtCoder関連ツール
-
AtCoder Library (ACL):
/lib/ac-libraryにインストール済み - atcoder-cli (acc): コンテスト管理ツール(npm経由)
- atcs: このテンプレートを作成した人が作ったシンプルなAtCoder用スクレイピングツール
その他
-
nodejs/npm: JavaScript実行環境(atcoder-cli実行用)
シンボリックリンク
-
g++→g++-13: デフォルトでg++-13を使用
使い方
新しい問題を解く
- 問題用のディレクトリを作成
mkdir abc123-a
cd abc123-a
- テンプレートをコピー
cp ../template.cpp main.cpp
- VS Codeで開いて編集
コードの実行
方法1: Code Runner拡張機能を使用(推奨)
- ファイルを開く
-
Ctrl+Alt+N(Mac:Cmd+Alt+N)で実行 - または、右上の▶ボタンをクリック
方法2: ターミナルから実行
g++ -O2 -std=c++23 main.cpp -o main
./main
方法3: デバッグモードで実行
F5キーを押すか、デバッグパネルから「C++:Debug」を選択
ブレークポイントで止まってくれます。
テンプレートファイルについて
template.cppには、競プロでよく使う機能が含まれています:
-
型エイリアス:
ll(long long)、ld(long double)、vi(vector)、vl(vector)、vvl(2次元配列)、vb(vector)、pl(pair)など -
マクロ:
-
rep(i, n):for (int i = 0; i < n; i++)の短縮 -
repn(i, num, n):for (int i = num; i < n; i++)の短縮 -
per(i, n): 逆順のfor文 -
all(v):v.begin(), v.end()の短縮 -
pb:push_backの短縮 -
fi,se:first,secondの短縮 -
LB(v, val),UB(v, val),BS(v, val): lower_bound、upper_bound、binary_searchの短縮 -
MINE(v),MAXE(v): min_element、max_elementの短縮
-
-
ユーティリティ関数:
-
yes(),YES(),Yes(): 真偽値の出力("yes"/"no"など) -
possible(),Possible(),POSSIBLE(): 可能性の出力 -
fast_io(): 高速入出力の設定 -
cinarr(v): 配列の一括入力 -
print(...): 可変長引数での出力 -
print_ld(x, precision): 固定小数点での出力 -
printarr(v, isReverse): 配列の出力 -
addv(v, loc, val): 配列要素の追加
-
-
その他の便利機能:
-
_pq<T>: 最小値優先のpriority_queue -
chmin(a, b),chmax(a, b): 最小値・最大値の更新 -
So(v),Sore(v): ソート関数 -
binary_count(a): ビットカウント
-
テンプレート部分は// clang-format offで囲まれているので、フォーマットされずにそのまま使えます。
AtCoder Library (ACL)の使用
AtCoder Libraryは自動的にインクルードパスに含まれています:
#include "atcoder/modint.hpp"
using mint = atcoder::modint998244353;
まとめ
このテンプレートを使うことで、競プロに集中できる環境が整います。
「ローカルで書いてサンプル入力を実行して合ってたら提出」という基本的な流れは変わりませんが、その過程で発生するケアレスミスを大幅に減らすことができます。
ぜひ、このテンプレートを使って快適な競プロライフを送ってください!
参考リンク
AtCoder関連
Dev Containers関連
ツール関連
環境構築関連






