今年も仕事でC++をたくさん書いたので、今年特にお世話になったC++のライブラリを並べてみます。
※ライブラリ・クラス・関数等へのリンク先は、cpprefjp C++日本語リファレンスです。
こんな標準ライブラリにお世話になった
<vector>, <deque>, <algorithm>, <unordered_set>, <unordered_map>
このあたりは今年に限った話ではないですが、アルゴリズムを組むことをやっているとよく使うところですね。パフォーマンスも考慮して作られているライブラリなので、(使い方を間違えなければ)速度の求められる実装であっても普通に使えます。
もっとも、行列(数学の)くらい必要となればライブラリに頼るわけですが。私はEigenをよく使ってます。
昨年は<set>や<map>も割と使っていたが、今年はかなり限られた回数しか使わなかった記憶。もう今となっては「C++11で標準化されているなら無条件に利用する」くらいの気持ちです。そうは言っても、先日はgcc4.4の環境を利用するという機会があった
<algorithm>では主にstd::all_ofとかstd::find_ifとかを活用した。std::all_ofがC++11で規格化されて、多くの環境で普通に使えるようになったのはありがたかったです。
<utility>
今年は割とstd::moveを使った気がする。「配列等の内容を書き換える必要があるのだが、in-placeにできるわけではない」という処理で主に利用した。
std::pairも結構使ったけど、標準ライブラリでstd::pairが指定されている場面以外では極力使わない方針にしつつある(2個の値を組にしたい場合であっても構造体を定義するとか)。first/secondが何を指しているかわからなくなってくるんですよね…。
<random>
昨年はそうでもなかったのだが、今年は乱数を用いるプログラムをよく書いたので、かなり使っていた。乱数生成器としてmt19937_64、乱数の分布として一様分布のuniform_int_distribution・uniform_real_distribution(と、場合によっては乱数発生装置random_device 1)しか使わなかったけど。
<sstream>
数値などを文字列化することが多かったので。以前はこれを使うのが億劫だったのだが、最近は慣れてきた。
しかし、ライブラリのファイル名が「sstream」なのに対してクラス名が「stringstream」なの、何か理由あるんですかねえ…
<cfloat>, <climits>
前者は数値計算関連、後者はビット演算関連で必要になった。ちょこちょこ使ってた。
今後の展望とか
2017年が終わるということで、この先C++17で標準化されたライブラリがもっと普通に使えるようになるのが楽しみですし、使える環境では使っていきたいですね。特に<optional>・<filesystem>・<string_view>は実装されてうれしいので。
※<string_view>はcpprefjpにまだ記事がないので、手前味噌ではありますが私が以前書いたスライドへのリンクを付けておきます。Boost.勉強会 #21 札幌「C++1zにstring_viewが導入されてうれしいので紹介します」
-
プログラムを動かして実験をするという目的の場合、あとで再現が可能なように「乱数のシードは手で指定して、それをいくつか試す」ということを行うので、random_deviceは試しに動かす用にしか使わなかったのである。 ↩