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();

シャッフル!

random_shuffle(c.begin(), c.end());

(追記)C++03 でもできました >< ゴメンヨー

おわりに

こんなこともできなかったのか C++ 集になりました。