C++ プログラマのための C++0x 入門
これは C++ advent calendar の参加記事です。
真面目な C++0x の紹介や入門は 25 日もあれば誰かが書いてくれると思うので、C++0x について何も知らなくてもすぐに分かる、ちょっとだけ幸せになれるかもしれない極めて些細な tips を書きます。後に変態記事ばかり続かないといいんですが :-)
条件を満たす要素が含まれているかどうかを知る
こんなコードを書いたことはないでしょうか?
if (c.end() != std::find_if(c.begin(), c.end(), equal_by_xxx())) // ugly!
終端のイテレータとの比較を毎回書かされるのは、正直うんざりですね。C++0x ならこう書けます。
if (std::any_of(c.begin(), c.end(), equal_by_xxx()))
古い API とのやりとりに STL コンテナを利用する
std::string や std::vector の連続性(contiguously)に関してはもう知っていると思うのですが、こんな風に思ったことはないでしょうか?
なんで std::string には data や c_str 等のメンバ関数があるのに、vector にはそれ相応のメンバ関数がないんだろう? &v[0] も &v.front() も &*v.begin() も、どれも醜い!
C++0x にはあります。
T* p = v.data();
(ちなみにライブラリに新たに加わる静的配列 std::array も data メンバ関数を持っています。)
最大/最小値を求める
こんなコードを書(略)
T n0 = ..., n1 = ..., n2 = ..., n3 = ...; T max_value = std::max(n0, n1, n2); // error! T max_value = std::max(n0, std::max(n1, std::max(n2, n3))); // ugly!
C++0x なら(略)
T max_value = std::max({n0, n1, n2, n3});
無駄な容量を捨てる
こ(略)
container<T>(c).swap(c); // shrink to fit!
c.shrink_to_fit();
おわりに
こんなこともできなかったのか C++ 集になりました。