lamnda函数--c++11中的匿名函数

来源:互联网 发布:通达信软件怎么用 编辑:程序博客网 时间:2024/06/05 04:38

部分转自https://www.cnblogs.com/pzhfei/archive/2013/01/14/lambda_expression.html

部分转自https://www.cnblogs.com/langzou/p/5962033.html

部分转自http://blog.csdn.net/liqinghua1653/article/details/12308801

C++11提供了对匿名函数的支持,称为Lambda函数(也叫Lambda表达式). Lambda表达式具体形式如下:

    [capture](parameters)->return-type{body}

为什么说 lambda 表达式如此激动人心呢?举一个例子。标准 C++ 库中有一个常用算法的库,其中提供了很多算法函数,比如 sort() 和 find()。这些函数通常需要提供一个“谓词函数 predicate function”。所谓谓词函数,就是进行一个操作用的临时函数。比如 find() 需要一个谓词,用于查找元素满足的条件;能够满足谓词函数的元素才会被查找出来。这样的谓词函数,使用临时的匿名函数,既可以减少函数数量,又会让代码变得清晰易读。

比如你代码里有一些小函数,而这些函数一般只被调用一次(比如函数指针),这时你就可以用lambda表达式替代他们,这样代码看起来更简洁些,用起来也方便。


下面举了几个Lambda函数的例子:  

[](int x, int y) { return x + y; } // 隐式返回类型[](int& x) { ++x; }   // 没有return语句 -> lambda 函数的返回类型是'void'[]() { ++global_x; }  // 没有参数,仅访问某个全局变量[]{ ++global_x; }     // 与上一个相同,省略了()
可以像下面这样显示指定返回类型:  

[](int x, int y) -> int { int z = x + y; return z; }
在这个例子中创建了一个临时变量z来存储中间值. 和普通函数一样,这个中间值不会保存到下次调用. 什么也不返回的Lambda函数可以省略返回类型, 而不需要使用 -> void 形式.

  

Lambda函数可以引用在它之外声明的变量. 这些变量的集合叫做一个闭包. 闭包被定义在Lambda表达式声明中的方括号[]内. 这个机制允许这些变量被按值或按引用捕获.下面这些例子就是:  

[]        //未定义变量.试图在Lambda内使用任何外部变量都是错误的.[x, &y]   //x 按值捕获, y 按引用捕获.[&]       //用到的任何外部变量都隐式按引用捕获[=]       //用到的任何外部变量都隐式按值捕获[&, x]    //x显式地按值捕获. 其它变量按引用捕获[=, &z]   //z按引用捕获. 其它变量按值捕获
void test() {vector<int> v = { 1,3,5,2,4,6 };std::sort(v.begin(), v.end(), [](int& v1, int& v2)->bool {return v1 < v2; });}

需要访问外部变量时:

void test() {vector<int> v = { 1,3,5,2,4,6 };int compTimes = 0;std::sort(v.begin(), v.end(), [&compTimes](int& v1, int& v2)->bool {compTimes++; return v1 < v2; });}

当我们想引用一个 lambda 表达式时,我们可以使用auto关键字,例如:

auto lambda = [] () -> int { return val * 100; };