便利すぎる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)の担当はクモハ君に任せたいと思います。どんな記事を書いてくれるのでしょうか。