lambda表达式的基本形式,如下:
[capture list] (params list) [key word: mutuble] ->return type { func body }
说明:
(1) [capture list]里面的内容具体形式如下:
(2)
params list 输入参数,这个和普通的函数一样
(3)keyword:mutuble:默认情况下,lambda表达式不会改变一个通过传值方式来捕获参数的值,通过mutuble可以实现这个问题。
(4)return type:默认该部分是可选的,但是如果lambda表达式有2个或以上的return,那么必须指定返回类型
(5) func body:函数体
以下是一些例子
#include <iostream>
#include <algorithm>
#include <string>
using namespace std;
void testCaptureList()
{
int a = 1;
int b = 2;
// auto fun = []() { cout << a + b << endl;}; // error 无法隐式捕获“a” "b",因为尚未指定默认捕获模式
auto fun0 = [a,b]() { cout << a + b << endl;}; //0k
fun0(); //3
auto fun1 = [=]() { cout << a + b << endl;}; // OK
// auto fun2 = [=]() { a++; cout << a + b << endl;}; // error C3491: “a”: 无法在非可变 lambda 中修改通过复制捕获
fun1(); //3
cout << "a = " << a << " b = " << b << endl;
auto fun3 = [&]() { a++; b++; cout << a + b << endl;};
fun3(); //5
cout << "a = " << a << " b=" << b << endl;
// auto fun4 = [=, &a] () { a++; b++; cout << a + b << endl;}; // error C3491: “b”: 无法在非可变 lambda 中修改通过复制捕获
auto fun5 = [&b, &a]() { a++; b++; cout << a + b << endl;};
fun5(); //7
}
void testReturnType()
{
auto fun1 = []() {return 1;};
cout << fun1() << endl;
auto fun2 = [](int a) {return a + 1;};
cout << fun2(4) << endl;
int bbb = 5;
//在VS2017编译可以通过,在code:blocks 16.01编译出现问题(error C3499: 已指定返回类型为 void 的 lambda 无法返回值)
auto fun3 = [](int a) { if (a < 0) return -a; else return a;};
cout << fun3(bbb) << endl;
auto fun4 = [](int a) -> int { if (a < 0) return -a; else return a;};
cout << fun4(-4) << endl;
}
void testMutable()
{
int v1 = 33;
auto f = [v1]() mutable {return ++v1;};
v1 = 0;
cout << f() <<" ," <<v1<<endl; //34,0
auto f1 = [&v1]() {return ++v1;};
v1 = 0;
cout << f1() << endl; //1
cout << v1 << endl; //1
auto f2 = [&v1]() {return ++v1;};
v1 = 0;
cout << f1() << "," << v1 << endl; //1,0 右结合原因
}
void testParam()
{
string a = "1111";
string b = "22222";
string c = "3333";
auto theSameLen = [](const string &a, const string &b) {return a.length() == b.length();};
cout << theSameLen(a, b) << endl; //0
cout << theSameLen(a, c) << endl; //1
auto addChZ = [](string &a) { a += "Z"; };
addChZ(a);
cout<<a<< endl; //1111Z
}
void Print(const int &a)
{
cout << a << " ";
}
int main()
{
int aa[] = { 1,2,3,4 };
for_each(aa, aa + 4, Print);
cout << endl;
for_each(aa, aa + 4, [](const int &a) { cout << a << " "; });
auto fun = [](int a, int b) { return a + b;};
cout << endl << fun(2, 3) << endl;
int a1 = 3;
auto fun2 = [a1](int a) {return a1 + a; };
cout << endl << fun2(33) << endl;
testCaptureList();
testReturnType();
testMutable();
testParam();
system("pause");
return 0;
}
关于lambda表达的效率问题,参考文章:
c++11 lambda 的效率