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. 如何解决iOS内存错误

    由于iOS5.0之前没有自动应用计数机制,也没有Java那样的垃圾回收功能.我们都需要自己管理和控制对象的回收,这是一件很麻烦的事情,也是做iOS项目中最容易出现的问题.如果不掌握这些方法,调试这些问 ...

  2. Laravel中利用队列发送邮件的方法示例

    https://www.jb51.net/article/121647.htm 本文主要给大家介绍了关于Laravel中队列发送邮件的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的 ...

  3. Object-c学习笔记十八-----NSPredicate

    Cocoa提供了一个类NSPredicate类,该类主要用于指定过滤器的条件,该对象可以准确的描述所需条件,对每个对象通过谓词进行筛选,判断是否与条件相匹配.谓词表示计算真值或假值的函数. NSPre ...

  4. 仿IOS效果-带弹簧动画的ListView

    背景介绍 最近项目打算做一个界面,类似于dayone首页的界面效果,dayone 是一款付费应用,目前只有IOS端.作为一个资深懒惰的程序员,奉行的宗旨是绝对不重复造一个轮子.于是乎,去网上找一大堆开 ...

  5. C++高精度加减乘除模板

    其中高精度乘法通过了POJ2389,其他没有测过,不过应该是没有问题的. 其中高精度除法返回一对string,分别表示商和余数. 代码: #include <bits/stdc++.h> ...

  6. 认识一下ES6的Reflect和Proxy

    Reflect Reflect要替代Object的很多方法, 将Object对象一些明显属于言内部的方法放到了Reflect对象上,有13个方法 Reflect.apply(target, thisA ...

  7. oracle避免在索引列上使用计算

    WHERE子句中,如果索引列是函数的一部分.优化器将不使用索引而使用全表扫描. 举例: 低效: SELECT … FROM DEPT WHERE SAL * 12 > 25000; 高效: SE ...

  8. typescript基础语法--变量/函数/指令/类

    博客地址 :https://www.cnblogs.com/sandraryan/ 要把ts文件引入到html中,首先要转码为js文件. 步骤: 终端运行: npm i -g typescript t ...

  9. TCP/IP模型的层次结构

  10. supersocket为动态命令增加命令过滤器

    由于我们无法像 C# 中一样方便的将 CLR 属性添加到 Python 文件或者函数中,因此我们需要定义一个函数 "getFilters()" 用于将命令过滤器方会给 CLR 运行 ...