#include <bits/stdc++.h>
このヘッダファイルはgccを入れると一緒についてくる。中身は次を参照のこと。
https://gcc.gnu.org/onlinedocs/gcc-4.9.2/libstdc++/api/a01220_source.html
標準ライブラリを一発でインクルードできるので、競技プログラミングなどの場面では面倒が省けてよい。
OSXやVC++では使えない?
OSXのCommand Line Toolsで手に入るgcc
コマンドは、実はclang
にオプションをつけたエイリアスになっている。gcc
が入っていないので、上記のヘッダファイルも提供されていない。
VisualStudioのVC++でもやはり提供されていないので、デフォルトでは使用することができない。
だが、便利なものは使いたい。なんとかしよう。
対処する
1. gccを手に入れる
gccに付属しているのでこれが一番手っ取り早い。
homebrew等のパッケージマネージャを用いる場合は、パスの参照順に影響を受けがちである。gcc -v
やwhich gcc
により自分が使っているgcc
が今インストールしたものかどうか確かめること。
2. bits/stdc++.h を作ってインクルードパスに含める
いくつか実現方法がある。
2.1 親ディレクトリに置く
親ディレクトリにディレクトリbits
を作り、その中にstdc++.h
を配置する方法がある。この方法の場合、
#include "bits/stdc++.h"
のように、ダブルクォートで囲う必要がある。
ダブルクォートと山括弧の間には、#include
を記載したファイルの親ディレクトリを起点とした検索をするかしないかの違いがある。つまり、gcc
でコンパイルするようなジャッジサーバにこの記法でbits/stdc++.h
をインクルードしたコードを送っても問題ない。
しかし、コードを書く場所が異なればそのたびに配置しなければならず、面倒である。
また上述の理由から、山括弧でbits/stdc++.h
を参照している他者のコードがそのままでは動かない。面倒である。
2.2 インクルードパスを増やす
適当な場所にbits/stdc++.h
を配置し、そのディレクトリをインクルードパスとして指定することで、山括弧でも参照できるようになる。
/path/to/parent/dir/bits/stdc++.h
に配置したとしよう。
2.2.1 コンパイルするときにオプションで指定する
$ g++ -I/path/to/parent/dir main.cpp
と書けば、
#include <bits/stdc++.h>
と書くことができる。
2.2.2 環境変数に書いておく
CPLUS_INCLUDE_PATH
環境変数に書いておくと、インクルードパスに含めてコンパイルしてくれる。オプションで指定するよりもっと楽だろう。既に値が入っている場合は、PATH
と同様の記法で複数のパスを書くことができる。
.bash_profileあたりに次のように書くことになる。
export CPLUS_INCLUDE_PATH=$CPLUS_INCLUDE_PATH:/path/to/parent/dir
注意すべきこと
先進的な機能に関するライブラリのインクルードが含まれている場合があるので、自分が今使っているコンパイラがそれらの機能に対応しているかを確かめておく必要がある。
2015年時点では<future>や<atomic>が該当するだろう。未対応のコンパイラでこういった項目をインクルードしているとコンパイルエラー等の問題が発生する。
参考
clang(1) - Linux man page
http://linux.die.net/man/1/clang
C/C++の#includeディレクティブの" "と< >の違い - HIDARI日記(右)
http://hidari-lab.hatenablog.com/entry/2013/03/20/235242
Useful C++ "library" - Codeforces"
http://codeforces.com/blog/entry/8387
homebrewでgcc4.9を入れたお話 - ぱーぽーのぷろぐらみんぐ記
http://purple-jwl.hatenablog.com/entry/20140706/1404655974
VisualStudioでもbits/stdc++.hでC++のヘッダファイルを一括インクルードしたい!
http://qiita.com/tosaka2/items/a52e065fb23613f70c63