c++11特性之Lambda表达式
2015-10-19 23:18
281 查看
“Lambda 表达式”(lambda expression)是一个匿名函数,Lambda表达式基于数学中的λ演算得名,直接对应于其中的lambda抽象(lambda abstraction),是一个匿名函数,即没有函数名的函数。
我第一次接触Lambda表达式是在C#中,后来才知道C++11引入了Lambada表达式。
SO C++ 11 标准的一大亮点是引入Lambda表达式。基本语法如下:
[capture list] (parameter list) ->return type { function body }
[] // 沒有定義任何變數。使用未定義變數會導致錯誤。
[x, &y] // x 以傳值方式傳入(預設),y 以傳參考方式傳入。
[&] // 任何被使用到的外部變數皆隱式地以參考方式加以引用。
[=] // 任何被使用到的外部變數皆隱式地以傳值方式加以引用。
[&, x] // x 顯示地以傳值方式加以引用。其餘變數以參考方式加以引用。
[=, &z] // z 顯示地以參考方式加以引用。其餘變數以傳值方式加以引用。
其中除了“[ ]”(其中捕获列表可以为空)和“复合语句”(相当于具名函数定义的函数体),其它都是可选的。
C++中,一个lambda表达式表示一个可调用的代码单元。我们可以将其理解为一个未命名的内联函数。它与普通函数不同的是,lambda必须使用尾置返回来指定返回类型。
你可能会问,除了那些表达式爱好者,谁会用lambda表达式呢?
1、距离
程序员认为,让定义位于使用的地方附近很有用,因此这样无需翻阅多页的源代码。从这个角度看,Lambda表达式是理想的选择,因为定义和使用是在同一个地方。
2、简洁
函数符代码比函数和Lambda表达式更加繁琐,函数和Lambda表达式的简洁程度相当。但是不同于函数的是,Lambda可以定义于函数内部。
3、lambda可访问作用域内的任何动态变量。
我第一次接触Lambda表达式是在C#中,后来才知道C++11引入了Lambada表达式。
SO C++ 11 标准的一大亮点是引入Lambda表达式。基本语法如下:
[capture list] (parameter list) ->return type { function body }
[] // 沒有定義任何變數。使用未定義變數會導致錯誤。
[x, &y] // x 以傳值方式傳入(預設),y 以傳參考方式傳入。
[&] // 任何被使用到的外部變數皆隱式地以參考方式加以引用。
[=] // 任何被使用到的外部變數皆隱式地以傳值方式加以引用。
[&, x] // x 顯示地以傳值方式加以引用。其餘變數以參考方式加以引用。
[=, &z] // z 顯示地以參考方式加以引用。其餘變數以傳值方式加以引用。
class CTest { public: CTest() : m_nData(20) { NULL; } void TestLambda() { vector<int> vctTemp; vctTemp.push_back(1); vctTemp.push_back(2); // 无函数对象参数,输出:1 2 { for_each(vctTemp.begin(), vctTemp.end(), [](int v){ cout << v << endl; }); } // 以值方式传递作用域内所有可见的局部变量(包括this),输出:11 12 { int a = 10; for_each(vctTemp.begin(), vctTemp.end(), [=](int v){ cout << v+a << endl; }); } // 以引用方式传递作用域内所有可见的局部变量(包括this),输出:11 13 12 { int a = 10; for_each(vctTemp.begin(), vctTemp.end(), [&](int v)mutable{ cout << v+a << endl; a++; }); cout << a << endl; } // 以值方式传递局部变量a,输出:11 13 10 { int a = 10; for_each(vctTemp.begin(), vctTemp.end(), [a](int v)mutable{ cout << v+a << endl; a++; }); cout << a << endl; } // 以引用方式传递局部变量a,输出:11 13 12 { int a = 10; for_each(vctTemp.begin(), vctTemp.end(), [&a](int v){ cout << v+a << endl; a++; }); cout << a << endl; } // 传递this,输出:21 22 { for_each(vctTemp.begin(), vctTemp.end(), [this](int v){ cout << v+m_nData << endl; }); } // 除b按引用传递外,其他均按值传递,输出:11 12 17 { int a = 10; int b = 15; for_each(vctTemp.begin(), vctTemp.end(), [=, &b](int v){ cout << v+a << endl; b++; }); cout << b << endl; } // 操作符重载函数参数按引用传递,输出:2 3 { for_each(vctTemp.begin(), vctTemp.end(), [](int &v){ v++; }); for_each(vctTemp.begin(), vctTemp.end(), [](int v){ cout << v << endl; }); } // 空的Lambda表达式 { [](){}(); []{}(); } } private: int m_nData; };
其中除了“[ ]”(其中捕获列表可以为空)和“复合语句”(相当于具名函数定义的函数体),其它都是可选的。
C++中,一个lambda表达式表示一个可调用的代码单元。我们可以将其理解为一个未命名的内联函数。它与普通函数不同的是,lambda必须使用尾置返回来指定返回类型。
你可能会问,除了那些表达式爱好者,谁会用lambda表达式呢?
1、距离
程序员认为,让定义位于使用的地方附近很有用,因此这样无需翻阅多页的源代码。从这个角度看,Lambda表达式是理想的选择,因为定义和使用是在同一个地方。
2、简洁
函数符代码比函数和Lambda表达式更加繁琐,函数和Lambda表达式的简洁程度相当。但是不同于函数的是,Lambda可以定义于函数内部。
3、lambda可访问作用域内的任何动态变量。
相关文章推荐
- c++11特性之Lambda表达式
- C语言实现打印乘法口诀表
- C语言中的可变参数函数 三个点“…”printf( const char* format, ...)
- C++模板
- class与struct的区别
- C++ 指针知识点整理
- ubuntu 安装 eclipse CDT 配置 sublime c++ 主题
- c++ primer第五版(中文)习题答案 第十章第六节-特定容器算法
- C语言的编译过程、安装gcc编译器以及设置环境变量
- [C++] any number to binary (Bit manipulation)
- 【UE4/C++】切换镜头
- C++入门学习——虚函数表介绍
- 顺序栈-C++实现
- 【UE4/C++】绑定输入响应
- realloc的故事
- 【UE4/C++】宏的使用
- 指针小谈.杀手锏和无底洞
- 阶乘计算升级版
- 项目39.1-3 亲密数
- C++程序中调用其他exe可执行文件方法