C++11 lambda使用
3123 ワード
Lambdaは匿名関数であり,inline関数として使用できる(プログラマーの「起名困難症候群」を解決するために用いられる)
Lambda関数形式:[...](...) ... {...}
[]内はcaptureで、lambda内部でアクセスできる「nonstatic外部変数」で、アクセスする変数がなければ空にできます.static変数は直接アクセスできます.
()内はパラメータで、関数パラメータと同じです.
... mutable、異常詳細、属性説明子(noexceptなど)、または戻りタイプです.いずれかが現れる場合は、()が表示されなければなりません.
{}内は関数体で、ここにlambdaが完成する仕事を明記します.
例:
最後の()は関数呼び出しです.
次のように呼び出すこともできます.
戻りタイプ:
C++のタイプ導出システムは、関数の戻りタイプを自動的に導出します.
Capture -- passing by value
Lambdaは内部でxxxを変更でき、外部変数に影響します.
特殊な形式:
[=] (...) ... {...} 外部のすべての変数をlambdaに渡しますが、内部では変更できません.passing by value
[&] (...) ... {...} 外部のすべての変数をlambdaに渡し、内部で変更でき、外部変数に影響を与える--passing by ref..
[=,&y] (...) ... {...} すべての変数をlambdaに渡して、yは内部で修正することができて、残りの変数はできません
[y, &] (...) ... {...} すべての変数をlambdaに渡します.yは内部で変更できません.残りの変数は
mutable:
このコードにはmutableキーワードがあるため、lambdaはpassing by valueとpassing by referenceの混合体となり、最初の呼び出し時に一時的なコピーが作成され、その後の呼び出しでこのコピーが変更されます.注意すべきは、lambdaが定義時からアクセス可能な値を取得し、id=0は、fがいつ呼び出されるかに関係なく取得される.
Lambdaのタイプを書くのはお勧めしません.タイプを書かなければならない場合はdecltype()を使用するか、STL内のfunction<>を使用します.
転載:https://www.cnblogs.com/DevinSuMi/p/6290688.html
Lambda関数形式:[...](...) ... {...}
[]内はcaptureで、lambda内部でアクセスできる「nonstatic外部変数」で、アクセスする変数がなければ空にできます.static変数は直接アクセスできます.
()内はパラメータで、関数パラメータと同じです.
... mutable、異常詳細、属性説明子(noexceptなど)、または戻りタイプです.いずれかが現れる場合は、()が表示されなければなりません.
{}内は関数体で、ここにlambdaが完成する仕事を明記します.
例:
#include
using namespace std;
int main()
{
[]() { cout << "hello, world" << endl; }();
return 0;
}
最後の()は関数呼び出しです.
次のように呼び出すこともできます.
auto f = []() { cout << "hello, world" << endl; };
f();
#include
using namespace std;
int main()
{
auto f = [](int a) { cout << "hello, world " << a << endl; };
f(12);
return 0;
}
戻りタイプ:
#include
using namespace std;
int main()
{
auto f = [](int a) { cout << "hello, world " << a << endl; return a; };
auto k = f(12);
cout << k << endl;
return 0;
}
C++のタイプ導出システムは、関数の戻りタイプを自動的に導出します.
// return int
auto f = [](int a) -> int { cout << "hello, world " << a << endl; return a; };
// return double
auto f = [](int a) -> double { cout << "hello, world " << a << endl; return a; };
Capture -- passing by value
#include
using namespace std;
int main()
{
int xxx = 10;
auto f = [xxx]() { cout << "hello, world " << xxx << endl; };
f();
return 0;
}
#include
using namespace std;
int main()
{
int xxx = 10;
auto f = [&xxx]() { cout << "hello, world " << ++xxx << endl; };
cout << xxx << endl;
f();
cout << xxx << endl;
return 0;
}
Lambdaは内部でxxxを変更でき、外部変数に影響します.
特殊な形式:
[=] (...) ... {...} 外部のすべての変数をlambdaに渡しますが、内部では変更できません.passing by value
[&] (...) ... {...} 外部のすべての変数をlambdaに渡し、内部で変更でき、外部変数に影響を与える--passing by ref..
[=,&y] (...) ... {...} すべての変数をlambdaに渡して、yは内部で修正することができて、残りの変数はできません
[y, &] (...) ... {...} すべての変数をlambdaに渡します.yは内部で変更できません.残りの変数は
mutable:
// from The C++ Standard Library
#include
using namespace std;
int main()
{
int id = 0;
auto f = [id]() mutable { cout << "id: " << id << endl; ++id; };
id = 42;
f();
f();
f();
cout << id << endl;
return 0;
}
// :
// id: 0
// id: 1
// id: 2
// 42
このコードにはmutableキーワードがあるため、lambdaはpassing by valueとpassing by referenceの混合体となり、最初の呼び出し時に一時的なコピーが作成され、その後の呼び出しでこのコピーが変更されます.注意すべきは、lambdaが定義時からアクセス可能な値を取得し、id=0は、fがいつ呼び出されるかに関係なく取得される.
Lambdaのタイプを書くのはお勧めしません.タイプを書かなければならない場合はdecltype()を使用するか、STL内のfunction<>を使用します.
転載:https://www.cnblogs.com/DevinSuMi/p/6290688.html