1 什么是Lambda函数

lambda函数是指简单的代码片段,通常认为是不值得命名的函数,它不能重复使用,能方便程序员使用,增强代码可读性,降低代码出错概率。

[ 捕获列表 ] (参数) -> 返回类型 {}

编译器通常会计算lambda函数的返回类型,所以一般不需要指定返回类型,但少数情况编译器可能无法判断返回类型,还是需要指定返回类型。

2 为什么要使用Lambda函数

c++定义了许多标准库函数,比如std::for_each,用来循环

int main()
{
std::vector<int> v = {1, 2, 3, 4, 5};
std::for_each(v.begin(), v.end(), print());
return 0;

如果只是在特定的地方使用一次的函数,还要编写一个完整的方法就会显得繁琐。

对于上面的这种使用场景,我们可以使用Lambda函数来实现。

std::for_each(v.begin(), v.end(), [](int element) {cout << element;} );

3 Lambda内部是如何工作的 (核心)

[&i] () { std::cout << i; }

struct anonymous
{
int &m;
anonymous(int &i) : m_i(i) {}
inline auto operator()() const
{
std::cout << i;
}
}

编译器为每个Lambda函数生成了如上的唯一闭包,捕获列表将成为闭包中构造函数的参数,如果是按引用捕获,那么对应数据类型的成员会在闭包中创建。

4 使用的好处

Lambda函数对代码的性能没有影响,反而能够使代码结构更加紧凑、易读,代码的编写更加方便。

5 使用Lambda表达式

int main()
{
int x = 100;
int y = 200;
auto print = [&] {
std::cout << __PRETTY_FUNCTION__ << " : "
<< x << " , " << y << std::endl;
};
print();
return 0;
}

上面的代码可以输出

auto main()::(anonymous class)::operator()() const : 100 , 200

6 Lambda函数捕获列表

捕获列表 意义
[ ] ( ) { } 不捕获外接变量
[=] ( ) { } 所有都按值捕获
[&] ( ) { } 所有都按引用捕获
[x] ( ) { } x按值捕获
[&x] ( ) { } x按引用捕获
[&,x] ( ) { } x按值捕获,其它的按引用捕获
[=,&x] ( ) { } x按引用捕获,其它的按值捕获
std::vector<int> v1;
int total = 0;
int value = 5;
std::for_each(begin(v1), end(v1), [&, value](int x)
{
total = x * value;
});

在这个例子中,value会被按值捕获,会存储一份拷贝的值,total会以引用的方式捕获,

可以使用auto帮助存储lambda函数

auto lambda_func_1 = [&](int x) {  };
auto removeListenerInVector = [&](std::vector<EventListener*>* listeners){
if (listeners == nullptr)
return; for (auto iter = listeners->begin(); iter != listeners->end(); ++iter)
{
auto l = *iter;
if (l == listener)
{
CC_SAFE_RETAIN(l);
l->setRegistered(false);
if (l->getAssociatedNode() != nullptr)
{
dissociateNodeAndEventListener(l->getAssociatedNode(), l);
l->setAssociatedNode(nullptr); // nullptr out the node pointer so we don't have any dangling pointers to destroyed nodes.
} if (_inDispatch == 0)
{
iter = listeners->erase(iter);
releaseListener(l);
}
else
{
_toRemovedListeners.push_back(l);
} isFound = true;
break;
}
}
};

还可以把lambda函数存储在变量、数组和vector中,把他们当作命名参数来传递

#include<functional>
#include<vector>
#include<iostream>
double eva(std::function<double(double)> f, double x = 2.0){return f(x);}
int main()
{
std::function<double(double)> f0 = [](double x){return 1;};
auto f1 = [](double x){return x;};
std::cout << eva(f0) << "\n";
std::cout << eva(f1) << "\n";
return 0;
}

Lambda函数到底是个什么的更多相关文章

  1. 细说Python的lambda函数用法,建议收藏

    细说Python的lambda函数用法,建议收藏 在Python中有两种函数,一种是def定义的函数,另一种是lambda函数,也就是大家常说的匿名函数.今天我就和大家聊聊lambda函数,在Pyth ...

  2. Python lambda函数

    python允许定义单行的小函数,定义lambda函数的形式如下: lambda 参数:表达式lambda函数默认返回表达式的值,可接收任意个参数,包括可选参数,但是表达式只有一个.

  3. python之map、filter、reduce、lambda函数 转

    python之map.filter.reduce.lambda函数  转  http://www.cnblogs.com/kaituorensheng/p/5300340.html 阅读目录 map ...

  4. python中lambda函数

    1.lambda函数使用如下: lambda语句中,冒号前是参数,可以有多个,用逗号隔开,冒号右侧的是返回值 >>> g=lambda x,y:x*y>>> g(4 ...

  5. Python 之 lambda 函数

    Python 支持一种单行匿名函数,这种函数称为 lambda,它最初借鉴自 Lisp. >>> add = lambda x, y: x +y >>> add(3 ...

  6. malloc 函数到底做了什么?

    请看下面的代码. 猜测结果是什么?编译通过吗? #include <stdio.h> #include <stdlib.h> int main() { ; char *ptr ...

  7. python之map、filter、reduce、lambda函数

    map map函数根据提供的函数对指定的序列做映射,定义:map(function, sequence[,sequence,...])--->list 例1 >>> map(l ...

  8. C++11—lambda函数

    [1]lambda表达式语法定义 lambda表达式的语法定义如下: [capture] (parameters) mutable ->return-type {statement}; (1) ...

  9. Python中的lambda函数

    今天在看书的时候,看到了这样的一条语句: if isinstance(value,int) or isinstance(value,float): split_function=lambda row: ...

随机推荐

  1. SSH基本原理

    SSH原理与运用:远程登录 作者: 阮一峰 年12月21日 SSH是每一台Linux电脑的标准配置. 随着Linux设备从电脑逐渐扩展到手机.外设和家用电器,SSH的使用范围也越来越广.不仅程序员离不 ...

  2. poj 1263 Reflections (Simple Geometry)

    1263 -- Reflections 简单计算几何.题目给出射线以及若干个不相交的圆,求出射线会在哪些圆上反弹,依次写出反弹球的编号. 代码如下: #include <cstdio> # ...

  3. windows上安装redis并安装php5.6的redis扩展

    http://www.884358.com/php-redis/ 1.安装redis Redis 没有官方的Windows版本,但是微软开源技术团队(Microsoft Open Tech group ...

  4. call_user_func_array() 内置函数

    func_get_args()方法是获取当前文件所有的函数参数 fun_num_args()这个方法是获取方法实参个数 call_user_func_array()这个方法是内置函数,可以直接调用函数 ...

  5. SuperSocket AppServer 的两个事件: NewSessionConnected 和 SessionClosed

    订阅事件: appServer.NewSessionConnected += new SessionHandler<AppSession>(appServer_NewSessionConn ...

  6. artTemplate模版引擎的使用

    artTemplate: template.js 一款 JavaScript 模板引擎,简单,好用.提供一套模板语法,用户可以写一个模板区块,每次根据传入的数据,生成对应数据产生的HTML片段,渲染不 ...

  7. Example-09-01

    #define _CRT_SECURE_NO_WARNINGS #include <cstdio> #include <cstring> int min(int a, int ...

  8. iptables rc.firewall脚本代码

    #!/bin/sh # # rc.firewall - Initial SIMPLE IP Firewall script for Linux 2.4.x and iptables # # Copyr ...

  9. JS开发常用工具函数 总结

    js原生工具库 1.isStatic:检测数据是不是除了symbol外的原始数据 */ function isStatic(value) { return( typeof value === 'str ...

  10. P1044 最大值最小化

    题目描述 在印刷术发明之前,复制一本书是一个很困难的工作,工作量很大,而且需要大家的积极配合来抄写一本书,团队合作能力很重要.当时都是通过招募抄写员来进行书本的录入和复制工作的, 假设现在要抄写 \( ...