C++11引入了lambda表达式,使得程序员能够定义匿名函数,该函数是一次性执行的,既方便了编程,又能防止别人的访问。ios
Lambda表达式的语法经过下图来介绍:程序员
这里假设咱们定义了一个如上图的lambda表达式。如今来介绍途中标有编号的各个部分是什么意思。算法
语法 | 序号 |
---|---|
[ 捕获列表 ] ( 形参数列表 ) mutable(可选) 异常属性 -> 返回值类型 { 函数体 } |
(1) |
[ capture-list ] ( params ) -> ret { body } |
(2) |
[ capture-list ] ( params ) { body } |
(3) |
[ capture-list ] { body } |
(4) |
将上图的代码片断补充完整:编程
int x = 10; int y = 3; int z ; z = [=]()mutable throw() -> int { int n = x + y; x = y ; y = n; return n;}(); cout<<z<<endl; cout<<"x:"<<x<<"\t"<<"y:"<<y<<endl;
运行结果为:数组
13函数
x: 10 y: 3学习
由于是以值传递的方式访问x,y因此x,y的值并无发生改变测试
如今咱们对lambda表达式的基本语法已经有一些了解,下面来举几个例子。spa
首先这个例子说明如何向lambda表达式里面传递参数:code
#include <iostream> using namespace std; int main() { int n = [] (int x, int y) { return x + y; }(5, 4); cout << n << endl; }
运行结果为:9
经过这个例子咱们能够看出,经过“函数体”后面的‘()’传入参数。
接下来这个例子能够看出,能够像调用函数同样使用lambda表达式,可是感受这种方式和普通函数的定义与调用就差很少了,这里只是学习使用方式而已。
#include <iostream> using namespace std; int main() { auto f = [] (int x, int y) { return x + y; }; cout << f(21, 12) << endl; }
运行结果为:33
Lambda表达式与STL算法一块儿使用,本身写测试代码的时候常常用到排序、输出数组什么的,经过下面列举的几个算法也比较方便:
#include <iostream> #include <algorithm> #include <ctime> using namespace std; int main() { int a[10] = {0}; srand(time(NULL)); generate(a,a+10,[]()->int { return rand() % 100; }); cout<<"before sort: "<<endl; for_each(a, a+10, [&](int i){ cout<< i <<" "; }); cout<<endl; cout<<"After sort"<<endl; sort(a,a+10); for_each(a, a+10, [&](int i){ cout<< i <<" "; }); return 0; }