C/C++教程

c++ lambda function

本文主要是介绍c++ lambda function,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

1.概述

考虑最简单的lambda function , [](){},它没有参数也没有返回值。

[]里面用来捕获函数外部的变量,而()里面就是匿名函数的参数{}里面就是函数的执行代码

One easy example:

#include <iostream>  
using namespace std;  
int main()  
{  
    auto func = [] () { cout << "Hello world"; };  //定义了一个lambda funciton
    func(); // now call the function  
}

2. lambda 表达式

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

如果没有参数的话 () 可以省略,返回值也可以省略。

Several easy examples:

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

3 .lambda 函数中的变量截取

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

[]			//不截取任何变量,试图在Lambda内使用任何外部变量都是错误的(全局变量除外).
[&]			//截取外部作用域中所有变量,并作为引用在函数体中使用
[=] 		//截取外部作用域中所有变量,并拷贝一份在函数体中使用
[=, &foo]   //截取外部作用域中所有变量,并拷贝一份在函数体中使用,但是对foo变量使用引用
[bar]   	//截取bar变量并且拷贝一份在函数体重使用,同时不截取其他变量
[this]		//截取当前类中的this指针。如果已经使用了&或者=就默认添加此选项。
-----------------------------
[x, &y]  	//x 按值捕获, y 按引用捕获.
[&, x]		//x显式地按值捕获. 其它变量按引用捕获
[=, &z]		//z按引用捕获. 其它变量按值捕获

4 .lambda函数与STL结合

常用举例1:

#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
typedef pair<int,int> PII;
int main()
{
    vecetor<PII>p;
    //假设p数组中已经有了数据,现在我们要对其根据PII的第二个值从大到小排序
    sort(p.begin(), p.end(), [](PII a, PII b){
        return a.second > b.second;
    });//如此编写调用lambda函数即可。
    return 0;
}

常用举例2:

lambda函数的引入为STL的使用提供了极大的方便。比如下面这个例子,当你想便利一个vector的时候,原来你得这么写:

vector<int> v;  
v.push_back( 1 );  
v.push_back( 2 );  
//...  
for ( auto itr = v.begin(), end = v.end(); itr != end; itr++ )  
{  
    cout << *itr;  
}  

现在有了lambda函数你就可以这么写

vector<int> v;  
v.push_back( 1 );  
v.push_back( 2 );  
//...  
for_each( v.begin(), v.end(), [] (int val)  
{  
	cout << val;  
} );

而且这么写了之后执行效率反而提高了。因为编译器有可能使用”循环展开“来加速执行过程(计算机系统结构课程中学的)

5 . References:
https://blog.csdn.net/xiaoguyin_/article/details/79798362
https://www.cnblogs.com/pzhfei/archive/2013/01/14/lambda_expression.html
https://www.cnblogs.com/lidabo/p/3908663.html

这篇关于c++ lambda function的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!