Lambda函数到底是个什么
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函数到底是个什么的更多相关文章
- 细说Python的lambda函数用法,建议收藏
细说Python的lambda函数用法,建议收藏 在Python中有两种函数,一种是def定义的函数,另一种是lambda函数,也就是大家常说的匿名函数.今天我就和大家聊聊lambda函数,在Pyth ...
- Python lambda函数
python允许定义单行的小函数,定义lambda函数的形式如下: lambda 参数:表达式lambda函数默认返回表达式的值,可接收任意个参数,包括可选参数,但是表达式只有一个.
- python之map、filter、reduce、lambda函数 转
python之map.filter.reduce.lambda函数 转 http://www.cnblogs.com/kaituorensheng/p/5300340.html 阅读目录 map ...
- python中lambda函数
1.lambda函数使用如下: lambda语句中,冒号前是参数,可以有多个,用逗号隔开,冒号右侧的是返回值 >>> g=lambda x,y:x*y>>> g(4 ...
- Python 之 lambda 函数
Python 支持一种单行匿名函数,这种函数称为 lambda,它最初借鉴自 Lisp. >>> add = lambda x, y: x +y >>> add(3 ...
- malloc 函数到底做了什么?
请看下面的代码. 猜测结果是什么?编译通过吗? #include <stdio.h> #include <stdlib.h> int main() { ; char *ptr ...
- python之map、filter、reduce、lambda函数
map map函数根据提供的函数对指定的序列做映射,定义:map(function, sequence[,sequence,...])--->list 例1 >>> map(l ...
- C++11—lambda函数
[1]lambda表达式语法定义 lambda表达式的语法定义如下: [capture] (parameters) mutable ->return-type {statement}; (1) ...
- Python中的lambda函数
今天在看书的时候,看到了这样的一条语句: if isinstance(value,int) or isinstance(value,float): split_function=lambda row: ...
随机推荐
- include 语句中使用双引号与括号有什么区别?
Include 的语法 你在学习如何构造函数时,看到了不同的 include 语句: # include <iostream> # include "distance.h&quo ...
- jQuery仿迅雷图片轮换效果
jQuery仿迅雷图片轮换效果 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "ht ...
- Timer更新UI的合理办法
using System; using System.Windows; using System.Timers; using System.Windows.Threading; namespace T ...
- HTML的基本结构和标签分类
HTML:超文本标记语言 HTML基本结构 <!DOCTYPE html> <html> <head> <meta charset="utf-8&q ...
- ip2long之后有什么好处?
ip2long需要bigint来存储,而且在32位和64位系统中存储方式还有区别: 而保存成字符串,只需要char20即可. 那么,ip2long好处在哪? 做投票项目的时候,将ip地址处理后用int ...
- git之本地仓库关联远程仓库
首先新建一个github respository 然后在自己本地新建一个maven项目,里面写点东西 如下图,将自己的项目所在地设置为本地git仓库 将本地仓库与远程关联,首先获取远程仓库的地址,点击 ...
- 智课雅思词汇---九、mon是什么意思
智课雅思词汇---九.mon是什么意思 一.总结 一句话总结:词根:mon(min) = to warn, to advise, to remind 1.mit是什么意思? 词根:-mitt-, -m ...
- java UDP传输
①:只要是网络传输,必须有socket . ②:数据一定要封装到数据包中,数据包中包括目的地址.端口.数据等信息. 直接操作udp不可能,对于java语言应该将udp封装成对象,易于我们的使用,这个对 ...
- 原生PHP实现Mysql数据分页功能
一. 思路整理 实现一个数据分页功能,需要有数据的总条数,每页展示的条数,和当前在第几页这三个参数 通过⌈总条数/每页展示的条数⌉可以得到总页数,比如某留言板有101条留言,每页展示10条,一那就需要 ...
- P1027 三角形的周长
题目描述 有n根棍子,棍子i的长度为Ai.现在想要从中选出3根棍子组成周长尽可能长的三角形.请输出最大周长,若无法组成三角形则输出0. 输入格式 第一行是一个正整数n(3<=n<=1000 ...