最近AOJやAtCoderで競技プログラミングを始めたのですが、いつも使っているPythonではどうしても計算時間でかなり不利になってしまいます。
AtCoderはNumPyが使えるということだったのでNumPyを使って挑戦してみましたが、どうしてもforループを書かずには解けない問題が多く、パフォーマンスに気を使いながらPythonで書くよりC++で書いたほうが楽だと考えてC++で挑戦することにしました。
ところがPythonに慣れていると、C++はデバッグする時にstd::vectorなどのコンテナの内容を出力するのがめんどくさくて仕方ないです。
下のようなコードで出力したいと考えるのは自然だと思いますが、残念ながらコンパイルエラーになります。
# include <iostream>
# include <vector>
int main() {
std::vector<int> vec = {1, 2, 3, 4, 5};
std::cout << vec << std::endl;
}
なんとか簡単に出力できる方法がないのかと探したところ、cxx-prettyprintという便利なライブラリを見つけました。
ヘッダオンリーなのでinclude文を追加するだけで、思っていたような出力ができるようになります。
# include <iostream>
# include <vector>
# include "cxx-prettyprint/prettyprint.hpp"
int main() {
std::vector<int> vec = {1, 2, 3, 4, 5};
std::cout << vec << std::endl;
}
[1, 2, 3, 4, 5]
2次元vectorにも対応しています。
# include <iostream>
# include <vector>
# include "cxx-prettyprint/prettyprint.hpp"
int main() {
std::vector<std::vector<int>> vec = {{1, 2, 3, 4}, {5, 6, 7, 8}};
std::cout << vec << std::endl;
}
[[1, 2, 3, 4], [5, 6, 7, 8]]
タイトルに"automagic pretty-printing of any container"と書いてあるので、std::vector以外のコンテナにも対応しているようです。
利用手順
- ソースコードがあるディレクトリで
git clone https://github.com/louisdx/cxx-prettyprint.git
を実行して、cxx-prettyprintをダウンロードする。 - ソースコードに
#include "cxx-prettyprint/prettyprint.hpp"
の1行を追加する。
たったこれだけでstd::vectorの内容をstd::coutに直接出力できるようになります。