はじめに
C++で競技プログラミングをする人はよく使うであろう「#include<bits/stdc++.h>」ですが、これを使用するとコンパイルに少し時間がかかるようになります。この問題は、ヘッダファイルをあらかじめコンパイルしておくことで解決することができます。具体的には、約2秒かかっていたコンパイルが約0.5秒で終わるようになりました。
なお、この記事よりも
の方がよりシンプルです。まずはこちらを読んだ方がいいかもしれません。
前提
基本的なC++の環境構築は出来ているものとします。具体的には、#include<bits/stdc++.h>を使用したコードが正常にコンパイルして実行できる状態です。
手順
bits/stdc++.hを探す
bits/stdc++.hがどこにあるかを探します。WSLを使用している場合、「/usr/include/x86_64-linux-gnu/c++/11/bits」にあると思います。
見つからなければ、以下の記事を参考に探しましょう。
bitsディレクトリに移動
cdコマンドなどを使用してbitsディレクトリに移動しましょう。
cd /usr/include/x86_64-linux-gnu/c++/11/bits
stdc++.hをプリコンパイルする
普段使っているオプションをつけて、stdc++.hをプリコンパイルします。
sudo g++ (普段使っているオプション) stdc++.h
例えば、筆者は普段
g++ -o ! testfile.cpp -D BLUEBERRY -Wall -I /home/blueberry/atcoder_codespace/ac-library-master/
でコンパイルしていますので、
sudo g++ -D BLUEBERRY -Wall -I /home/blueberry/atcoder_codespace/ac-library-master/ stdc++.h
となります。sudoが必要なことに注意です。
なお、このやり方では一つのコンパイルオプションにしか対応できませんが、複数のコンパイルオプションに対応することもできます。以下の記事が参考になると思います。
動作確認
ここからは、普段使っているディレクトリに戻って大丈夫です。普段と同じようにコンパイルして、コンパイルが速くなっているかを確かめましょう。きちんと確かめたい場合、-Hオプションを付けることで、どこからincludeされているかを調べることができます。
手順は以上となります。
注意点
include<bits/stdc++.h>はファイルの先頭に書きましょう。 筆者が詰まった原因はここでした。using namespace stdなどをincludeよりも上に書いていると正常に動作しません。
うまくincludeされない場合、includeが一番最初に入っていないか、コンパイルオプションが間違っている(ヘッダファイルのプリコンパイル時のオプションと一致していない)可能性が高いです。