Sideswipe

情報工学、計算論的神経科学など、真面目なこと書くブログ。お仕事の話は Twitter: @kazoo04 にお願いします。

C++ポケットリファレンスを著者の方から頂いたのでレビュー

C++ポケットリファレンス」を著者の方から頂いた。
レビューを書く約束だったのだがずいぶん長い間放置してしまった。申し訳ない。

C++ ポケットリファレンス

C++ ポケットリファレンス

はじめに

私は普段あまりC++は使わないのだが、たとえばOpenCVを使うときなどはC++を使っている(Python版はサポートされていない機能があったりするので使っていない)。

ところが、あまりC++のノウハウがないので実際はかなりCに近い書き方で使っている。
絶対もっといいやり方があるんだろうなとは思いつつ、惰性で適当に使っていたところでこの本を頂いたので、ポケットリファレンスとはあるもののとりあえず先頭から読み始めることにした。

ちなみにテレビの取材を受けた時にも私の机の上にバッチリ写っている。

f:id:kazoo04:20150320190350p:plain

内容について

表紙にも「逆引きだから困ったときにササッとわかります」と書いてあるが、実は2章までは言語仕様の紹介で、C++をまったく触ったことがない人でも十分読める粒度での解説がなされている。変数や配列といったレベルから扱っているので、他の言語をある程度理解している人であればC++の入門書としても使えるものになっている(おまけにC++11の言及もある。そう、C++11に対応しているのだ)。

入門書の場合、豊富なカラーイラストがないとダメだと言う人には少々つらいかもしれない。私は独習CでC言語を学んだクチなのでむしろ読み進めやすいと感じた。

3章は例外、4章は文字列なので実質1/4くらいは入門書として使えるような形で、残りが逆引きリファレンスといった形になっている。

個人的には6章「ユーティリティ」あたりが一番有益で、たとえば乱数を生成するときには random() が信用できなかったので、メルセンヌツイスタのライブラリ http://www.math.sci.hiroshima-u.ac.jp/~m-mat/MT/mt.html を使っていたのだが、実はC++11であれば std::mt19937 というそのままの乱数生成ライブラリが存在する(古き良き線形合同法やその他のアルゴリズムも利用できる)。
さらに便利なことに分布を指定することもでき、以前は自力で実装していた正規分布も `normal_distribution` を使えば極めて簡単に生成可能であることを知った。

たとえば1から100までの乱数を一様分布で生成する場合は以下のように書ける(p290から改変して引用)。

std::mt19937 engine ;
std::uniform_int_distribution<int> dist(1, 100) ;
std::cout << dist(engine) << std::endl ;

これはかなり便利だ。

複素数の扱いや数学関数についても、一覧にして概要をまとめてくれているので、ポケットリファレンスの名に恥じない、困った時にさっと見られるようなものに仕上がっている。

その他の点

あとはおまけとして巻末にC++を使う上で便利なサードパーティのライブラリが色々紹介されており、「とりあえず王道のものを」と考えている場合にはここを見るだけで十分かと思う。たとえば Google Test や Eigen や Qt などの著名なライブラリが紹介されている(ごく簡単な紹介だけでサンプルコードなどはない)。

さいごに

対象としては、ある程度プログラミングはできて、C++も書いたことはあるが詳しいことはわからないまま非効率なコードを書き続けてるような、つまり私のようなタイプの人間にはぴったりで、逆にまったくプログラミングをしたことがない人には少々難しすぎるので、心当たりのある人であればぜひ手元に置いておくと良いかもしれない。

C++ ポケットリファレンス

C++ ポケットリファレンス