C ++ 11個のラムダ関数

** 1.ラムダ機能概要
1.1。ラムダ関数「キャプチャリスト」の説明
2.ラムダ特性関数
3.ラムダ関数の使い方
4.ラムダ関数とSTL

  1. ラムダ関数の概要
    匿名関数は、λの数学的計算が来るであり、ラムダ式は、関数が関数名ではないことを、匿名関数です。一般的に、ラムダ関数の構文定義は次のとおりです。**
[capture] (parameters) mutable ->return-type {statement}

ここで、
[キャプチャ]:キャプチャリスト。キャプチャリストは常にラムダの初めに登場していること、ラムダで始まります。これは、ラムダ演算子(すなわち、開始フラグ)描かれています。コンパイラは、関数は、ラムダ関数に基づいて判断されることとすることができる「フラグ」。ラムダの関数としてコンテキスト変数をキャプチャする「キャプチャリスト」ながら。
(パラメータ):パラメータのリスト。常識や機能の引数C / C ++と同じです。この部分は、我々は、ブラケットと一緒にするパラメータを渡す必要がない場合は、「()」一緒に省略することを意味し、任意です。
可変:キーワードは修飾子です。デフォルトの場合、ラムダ関数は常にconstとして返しますが、我々は、引数リストの後に「可変」というキーワードをマークしたとき、あなたは一定の自然をキャンセルすることができます。ラムダ可変で改質剤を使用し、「パラメータリスト」が省略されていません(でも、パラメータがnullです)。
- >戻り値型:関数の戻り値の型。そして、プロパティ値の同じタイプの正常復帰でC / C ++の関数。主な目的は、ラムダ関数(戻り値がケース)の戻り型を追跡することです。ノーリターン値ラムダ関数ならば、この部分は直接省略することができます。
{ステートメント}:その機能。関数のパラメータリストの本体内の変数に加えて使用することができ、またすべての変数(すなわち、[キャプチャ]変数)を捕捉するために使用されてもよいです。

以下を参照してください。
ここに画像を挿入説明

1.1。ラムダ関数「キャプチャリスト」詳細
「リストをキャプチャ」は、C ++ 11ラムダ関数「」0以上の「捕捉用語」コンポーネント、およびカンマ区切りです。キャプチャリスト次の形式:

(1)VaRは】VARを捕捉する段変速モードの値を表します。

#include <iostream>
#include <string>
#include <stdio.h>
using namespace std;
int main()
{
   int a = 1,b =2, c =3;
   auto retVal = [=,&a,&b]()
   {
       printf("inner c[%d]\n",c);
       a = 10;
       b = 20;
       return a+b;
   };

   printf("sum[%d]\n",retVal());
   printf("a[%d] b[%d] c[%d]\n",a,b,c);
   return 0;
}
打印结果:
inner c[3]
sum[30]
a[10] b[20] c[3]

上記のコード、3つの成分の「キャプチャリスト」。参照変数は可変通過cの値を捕捉するように、A、Bをキャプチャするために渡さ。従って変数ラムダ式の関数本体およびBを変更した後、B値親範囲も変化します。それは値によって渡されるため、さらには、まだ影響を受けませんラムダ関数、Cの親スコープ内の変数cの値を変更します。(必要性に加えて、パラメータリストの後に変更可能なキーワード(修飾))。同時に、

#include <iostream>
#include <string>
#include <stdio.h>
using namespace std;
int main()
{
   int a = 1,b =2, c =3;
   auto retVal = [=,&a,&b]() mutable->int
   {
       printf("inner c[%d]\n",c);
       a = 10;
       b = 20;
       c = 30;
       printf("inner c2[%d]\n",c);
       return a+b;
   };

   printf("sum[%d]\n",retVal());
   printf("a[%d] b[%d] c[%d]\n",a,b,c);
   return 0;
}
打印结果:
inner c[3]
inner c2[30]
sum[30]
a[10] b[20] c[3]

(2)[=]意味する(この含む)値親スコープから渡されたすべての変数を取り込みます。
(3)[&VAR]は参照変数送信キャプチャVARを表します。
(4)[b](これを含む)(2020年2月18日午前9時36分12秒に変更された)変数すべての伝送率親スコープ・キャプチャへの参照です。

#include <iostream>
#include <string>
#include <stdio.h>
using namespace std;
int main()
{
   int a = 1,b =2, c =3;
   auto retVal = [&]() mutable->int
   {
       printf("inner a[%d] b[%d] c[%d]\n",a,b,c);
       a = 10;
       b = 20;
       c = 30;
       return a+b;
   };

   printf("sum[%d]\n",retVal());
   printf("a[%d] b[%d] c[%d]\n",a,b,c);
   return 0;
}
打印结果:
inner a[1] b[2] c[3]
sum[30]
a[10] b[20] c[30]

(5)[これはこのポインタをキャプチャするために現在の送信モードの値を表します。
同様に(2)、(3)、(5)は、上記の2つの例を参照することができます。

  1. ラムダ関数特性
    C ++ 11(1)、ラムダ関数は、インライン(インライン)です。

  2. ラムダ関数の使い方

#include <iostream>
#include <string>
#include <stdio.h>
using namespace std;
int main()
{
   int a = 6;
   int b = 8;
   auto sum = [](int a,int b) ->int{return a + b;};
   printf("sum[%d]\n",sum(a,b));
   return 0;
}
//打印结果:sum[14]

コードは、単純なラムダ関数の定義、データの2つのタイプを受信可能な機能一覧Int関数、およびint型の戻り値。

注:ラムダ関数、パラメータリストや戻り値の型は、オプションの部分、およびキャプチャのリストであり、また、ブランクとして機能することができます。

公開された85元の記事 ウォンの賞賛169 ビュー160 000 +

おすすめ

転載: blog.csdn.net/gaoyi221119/article/details/104573334