便利すぎるC++11
こんばんは、スペードです。
部活の方針がcocos2d-xでの開発になったらしいので、今回はC++11の便利なもののほんの一部を紹介したいと思います。
配列
C++11でソースコードを書くとき、普通の配列を使っていませんか?C++11には std::array という普通の配列のように使えるのはもちろん、それに加えて色々な機能を持っているすばらしいものがあります。
使い方
// 宣言 int a[10] = {5, 4, 3, 2, 1, 0, 9, 8, 7, 6}; // 普通の配列 std::array<int, 10> ar = {9, 8, 1, 2, 3, 7, 6, 5, 4, 0}; // std::array // ソート std::sort(a, a + 10); std::sort(ar.begin(), ar.end()); // また、C++11から使える範囲ベースforというものもある。 for(const auto& v : a) std::cout << v << std::endl; for(const auto& v : ar) std::cout << v << std::endl;
補足しておくと、上記のように、std::arrayはイテレータを使うことができます。
ラムダ式
僕がC++11で実装されたもので特に気に入っているものが、ラムダ式です。
ラムダ式とは
無名関数とも呼ばれ、関数を記述するための記法であり、関数オブジェクトの一種です。
無名関数??関数オブジェクト??と思われて難しく感じるかもしれませんが、使い方を見てもらえば簡単にラムダ式を書けるようになります。
使い方
[]{};
これが(最小の)ラムダ式です。
冗談はさておき(最小のラムダ式というのは本当です)、実際の使い方を見てみましょう。
[]{ std::cout << "Hoge!!" << std::endl; }; // Hoge!!を表示するラムダ式 auto func = []{ std::cout << "Hoge!!" << std::endl; }; // 変数に代入することができ、型推論も利用可能 []{ std::cout << "Hoge!!" << std::endl; }(); // ()で呼び出し可能 [](int x){ std::cout << x << std::endl; }; // 引数も与えられる。 [&](int x){ std:: cout << x << std::endl; }; // [&]で参照渡し、[=]で値渡し(コピー) [ キャプチャ(&, =) ]( 引数 ){ 処理 }() // ラムダ式の文法(二つ目の括弧をつけると呼び出しになる) // STLとラムダ式 std::vector<int> vec{2, 4, 6, 8, 10}; // 5未満の要素を削除 vec.erase(remove_if(vec.begin(), vec.end(), [=](int x){ return x < 5; }), vec.end());
ラムダ式いがかでしたか?最後の例で挙げたように、STLと併用することでき、使いこなせれば強い味方になってくれると思います。
まとめ
C++11の機能はもっとたくさんあります。リファレンスなどを閲覧してみるのもいいかもしれません。
明日(12/13)の担当はクモハ君に任せたいと思います。どんな記事を書いてくれるのでしょうか。