lambda是一种匿名函数,python  lambda可以使简单的函数简洁的表达,,C++的lambda使类似嵌套函数的功能得以实现

python的lambda

lambda [arg1[,arg2,arg3....argN]]:expression

#用def定义的函数
def foo():
return 'hello world'
print(foo())
#用lambda定义的函数
print(lambda:'hello world')
#因为没有给它保存到变量,用完后就失效了,提高了性能
foo_1=lambda:'hello world'
print(foo_1())
#加参数
foo_3=lambda a,b=10:a+b
print(foo_3(20,10))
foo_4=lambda *args:args
print(foo_4(1,2,3,4))
#lambda表达式必须在一行,python一行写不下可以用\换行
foo_5=lambda **kwargs:\
kwargs
print(foo_5(a=1,b=2,c=3))
#还可以变量间赋值
foo_2=foo_1
print(type(foo_2))

C++的lambda

直接使用,对于一些不重复使用的函数,使用完了自动丢弃

int result = [](int a) {return a*a; }();
cout << result << endl;

如果要反复利用,可以使用变量来存储

auto pow_2 = [](int a) {return a*a; };
cout << pow_2() << endl;

lambda的类型

cout << typeid(pow_2).name() << endl;      //类型是class <lambda_a10bdd2a3443eccb15c2cfee0f251b1b>

  1. Capture 子句(在 C++ 规范中也称为 lambda 引导。)

  2. 参数列表(可选)。 (也称为 lambda 声明符)

  3. 可变规范(可选)。

  4. 异常规范(可选)。

  5. 尾随返回类型(可选)。

  6. “lambda 体”

1,lambda引导

位置可传入外部参数,可以通过传值或传址方式直接传入外部数据

[&] 通过引用传入外部所有变量(地址不会变),[=]通过数值传入外部所有变量,[i]指定变量传值,[&i]指定变量传址

int i = ;
int front = (int)&i; //front是i的地址
cout << i << "-->" << front << endl; //输出这次地址
cout << &front << endl; //查看front的地址
auto func_1 = [i,&front] { //传入i(传值)和front(传址)
int back = (int)&i;
cout << i << "-->" << back << //输出这次地址
"\nback-front=" << abs(back - front) << endl;
cout << &front << endl; //再次查看front地址
};
func_1();
//得出
/*
10-->7601564 第一次的i
0073FD90 第一次的front
10-->7601536 第二次的i
back-front=28
0073FD90 第二次的front
*/
struct S { void f(int i); };

void S::f(int i) {
[&, i]{}; // 在所有都为引用的时候,可以指定一个不为引用
[&, &i]{}; // 当默认全部引用的时候,不能在指定i为引用
[=, this]{}; // ERROR: this when = is the default
[i, i]{}; // 变量不能重复
}

2,参数列表,auto使用泛型值,或者指定类型

char* a = "aaa";
char* b = "bbb";
[](auto& a, auto& b) {
auto temp = a;
a = b;
b = temp;
}(a,b);
cout << a <<" "<< b << endl;

3,可变规范

一般情况下,通过传值获得的变量不能修改

int n = ;
[&, n]() {++n; }();
//提示错误:“n”: 无法在非可变 lambda 中修改通过复制捕获

mutable规范允许lambda中修改n的值,由于n是通过值捕获,在lambda结束后,n的值不会变

int m = ;
int n = ;
[&, n](int a)mutable {m = ++n + a; }();
cout << m << " " << n << endl;
5
0

4,异常规范

5,返回值由char*变成string

char a[] = "aaa";
char* b = "bbb";
auto merge_str=[](char* a, char* b)->string{
char* result = strcat(a, b);
return result;
};
cout << merge_str(a, b)<<"-->"<<typeid(merge_str(a, b)).name() << endl;

6,lambda体,可放入任意代码块

lambda表达式赋值方法:

//1,可赋值给auto变量
auto f1 = [](int x, int y) {return x + y; };
cout << f1(,) << endl;
//2,可赋值给函数对象
function<int(int, int)>f2 = [](int x, int y) {return x + y; };
cout << f2(,) << endl;
3
7

find_if()  参数一:迭代器头部  参数二:迭代器尾部  参数三,返回一个指针  返回值:找到的元素的指针

vector<char*>v1 = { "aaa","bbb","ccc","ddd","eee" };
auto result=
find_if(v1.begin(), v1.end(), [](char* n) { return n=="ccc"; });
cout << *result << endl;
ccc

lambda嵌套

int result = [](int x) {return [&x](int y) {return (x + y); }(); }();
cout << result << endl;
30

最新文章

  1. EF Code First 一对多、多对多关联,如何加载子集合?
  2. An entity object cannot be referenced by multiple instances of IEntityChangeTracker.
  3. js模版引擎handlebars.js实用教程——each-循环中使用this
  4. URLConnection 和 HttpClients 发送请求范例
  5. std::back_inserter函数用法
  6. GC是什么? 为什么要有GC?
  7. DBA_Oracle Erp R12安装虚拟机镜像IP修正(案例)
  8. jsp中如何用jstl实现if(){}else if(){}else{}
  9. HttpServletRequest 获取URL的方法及区别
  10. First Missing Positive 解答
  11. linux之SQL语句简明教程---表格连接
  12. 分布式开放消息系统(RocketMQ)的原理与实践(转)
  13. Go 1.9 sync.Map揭秘
  14. (77)Wangdao.com第十五天_JavaScript 用于数据交换的文本格式 JSON 对象
  15. BZOJ 4259 残缺的字符串
  16. 20.翻译系列:Code-First中的数据库迁移技术【EF 6 Code-First系列】
  17. Gulp--Less
  18. ubuntu nginx本地局域网布署sever_name设置
  19. Thunder-Beta发布中间产物-2017秋-软件工程第十次作业
  20. Socket通信简单实例(WCF调用Socket)

热门文章

  1. 转载:Hadoop安装教程_单机/伪分布式配置_Hadoop2.6.0/Ubuntu14.04
  2. JavaScript使用XMLHttpRequest 發送GET/Post 請求
  3. Oracle 用户管理与权限控制
  4. [zz] Principal Components Analysis (PCA) 主成分分析
  5. combox 同时写入和获取 text ,value
  6. AngularJS---表达式
  7. TinyHTTP代码核心流程
  8. Stick hero &quot;攻略&quot;, android 代码编写与分析(后台截屏, 后台模拟点击)
  9. OAF_开发系列18_实现OAF页面跳转setForwardURL / forwardImmediately(案例)
  10. datetime