C++11のlambda式
C++では、lambda式は呼び出し可能なコードユニットを表す.名前のないインライン関数として理解できます.
1、lambda式の形式:
[capture list] (parameter list) -> return type { function body }
ここでは、キャプチャリストは空であってもよいが、省略できないものを含む必要がある[]と、具名関数で定義された関数体に相当する複合文以外はオプションです.
注意:lambda式と関数:
通常の関数とは異なり、lambdaはテールバックを使用して戻りタイプを指定する必要があります(戻りタイプを指定する必要がある場合)、デフォルトのパラメータは使用できません.lambdaは関数の内部で定義できます.
その1、2箇所でしか使われない簡単な操作は、lambda式が最も役に立ちます.
同じ操作を多くの場所で使用する必要がある場合は、多くの文が必要です.通常、関数を使用するとより良いです.
lambdaのキャプチャリストが空の場合、通常は関数で置き換えることができます.しかし,局所変数をキャプチャするlambdaでは関数で置き換えるのは容易ではない.
たとえばのstd::sort,ISO C++98を呼び出すと、まずcompare関数を書きます:bool compare(int&a,int&b){return a>b;//降順ソート}
そして、sort(a,a+n,compare);
しかし、C++11規格で追加されたLambda式は、sort(a,a+n,[](int a,int b){returna>b;});//降順ソートでは、コードが明らかに簡潔になります.
Lambdaのタイプは一意であるため、タイプ名で対応するオブジェクトを明示的に宣言することはできませんが、autoキーワードとタイプ導出:auto f=[](int a,int b){return a>b;};
2、取得リストの使用
Lambdaは、1つの関数体でローカル変数を使用することができますが、明確に指定された変数しか使用できません(これらのローカル変数をキャプチャリストに含めることで使用できます).
1つのlambda式は、そのキャプチャリストに存在する関数のローカル変数を補充してこそ、関数体でこの変数を使用することができます.
キャプチャリストはローカル非static変数にのみ使用され、lambdaはローカルstatic変数とその関数の外で宣言された名前を直接使用できます.
可能であれば、ポインタのキャプチャと参照のキャプチャをできるだけ避けるべきです.lambdaの変数キャプチャをできるだけ単純化します.
値の取得:
リファレンスの取得:
3、取得した変数の値を変更する場合は、パラメータリストの先頭にキーワード「mutable」を付けなければなりません.
1、lambda式の形式:
[capture list] (parameter list) -> return type { function body }
ここでは、キャプチャリストは空であってもよいが、省略できないものを含む必要がある[]と、具名関数で定義された関数体に相当する複合文以外はオプションです.
注意:lambda式と関数:
通常の関数とは異なり、lambdaはテールバックを使用して戻りタイプを指定する必要があります(戻りタイプを指定する必要がある場合)、デフォルトのパラメータは使用できません.lambdaは関数の内部で定義できます.
その1、2箇所でしか使われない簡単な操作は、lambda式が最も役に立ちます.
同じ操作を多くの場所で使用する必要がある場合は、多くの文が必要です.通常、関数を使用するとより良いです.
lambdaのキャプチャリストが空の場合、通常は関数で置き換えることができます.しかし,局所変数をキャプチャするlambdaでは関数で置き換えるのは容易ではない.
たとえば
そして、sort(a,a+n,compare);
しかし、C++11規格で追加されたLambda式は、sort(a,a+n,[](int a,int b){returna>b;});//降順ソートでは、コードが明らかに簡潔になります.
Lambdaのタイプは一意であるため、タイプ名で対応するオブジェクトを明示的に宣言することはできませんが、autoキーワードとタイプ導出:auto f=[](int a,int b){return a>b;};
2、取得リストの使用
Lambdaは、1つの関数体でローカル変数を使用することができますが、明確に指定された変数しか使用できません(これらのローカル変数をキャプチャリストに含めることで使用できます).
1つのlambda式は、そのキャプチャリストに存在する関数のローカル変数を補充してこそ、関数体でこの変数を使用することができます.
キャプチャリストはローカル非static変数にのみ使用され、lambdaはローカルstatic変数とその関数の外で宣言された名前を直接使用できます.
可能であれば、ポインタのキャプチャと参照のキャプチャをできるだけ避けるべきです.lambdaの変数キャプチャをできるだけ単純化します.
値の取得:
void fucn1()
{
size_t v1 = 42;//
// v1 f
auto f = [v1] {return v1; };
v1 = 0;
auto j = f(); //j 42;f v1
}
リファレンスの取得:
void fucn2()
{
size_t v1 = 42;//
// f2 v1
auto f2 = [&v1] {return v1; };
v1 = 0;
auto j = f2(); //j 0;f2 v1 ,
}
3、取得した変数の値を変更する場合は、パラメータリストの先頭にキーワード「mutable」を付けなければなりません.
void fucn3()
{
size_t v1 = 42;//
//f
auto f = [v1] () mutable {return ++v1; };
v1 = 0;
auto j = f(); //j 43;f v1
}
void fucn4()
{
size_t v1 = 42;//
//v1 const , f2
auto f2 = [&v1] {return ++v1; };
v1 = 0;
auto j = f2(); //j 1
}