algorithm.hpp

ひょんなことから まわりの関数 ( http://www.cplusplus.com/reference/algorithm/ ) を使うようになってあー iterator という interface ですべて操作するわけかなるほどとか思ってたんだけど欲しいものがなかったので書いてみた。

util::algorithm::copy_if() 関数はなんで標準に無いのか不思議なんだけど ( で定義されてる関数見てると input と output が 1 : 1 対応しているものしかないので結果が不定の個数になるようなものは標準では定義しないという policy なのかも ) std::count_if と組み合わせると sequence container ( std::vector, std::list, std::deque ) との相性もなかなかよい感じ。まぁ container を 2 回走査してるわけなのでそんなに速いわけではないと思うけど std::vector は reserve() を先に呼ぶとよいよ的な観点からするとあながち間違ってないはず。

他はすべて ostream に何かしら copy するというものなんだけど C++ では sequence container だとか配列の中身を console に表示するには以下のような code が pattern としてあるみたいで、

// make ostream_iterator
std::ostream_iterator<const char*> oitr(std::cout, "\n");
// copy contents to ostream_iterator
std::copy(argv, argv + argc, oitr);

これはこれで compact に書けるなぁとちょっと感心したんだけど関数名が copy なので直感的じゃないのといちいち ostream_iterator を作るのもアレだなぁと思ったので上記とほぼ同じ処理を wrap した関数を print なんちゃらという名前でいくつか定義してみた。上記と同様の処理をするには以下のような感じ。まぁ細かいところは sample code 参照ということで。

util::algorithm::print<const char*>(argv, argv + argc, std::cout, "\n");