LoginSignup
10
8

More than 5 years have passed since last update.

vectorなどのコンテナの内容をPythonみたいに簡単にcoutに出力する方法

Posted at

最近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以外のコンテナにも対応しているようです。

利用手順

  1. ソースコードがあるディレクトリでgit clone https://github.com/louisdx/cxx-prettyprint.gitを実行して、cxx-prettyprintをダウンロードする。
  2. ソースコードに#include "cxx-prettyprint/prettyprint.hpp"の1行を追加する。

たったこれだけでstd::vectorの内容をstd::coutに直接出力できるようになります。

参考リンク

louisdx/cxx-prettyprint: A header-only library for C++(0x) that allows automagic pretty-printing of any container.

C++で配列の内容を出力するを3種 - Qiita

10
8
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
10
8