如何定义和使用一个 Lambda 表达式

如何定义和使用一个 Lambda 表达式

什么是Lambda?

C++11引入lambda,是一份功能定义式,可以被定义于语句(statement)或表达式(expression)内部。
完整的lambda形式如下:

[= ,&y](arg_type)->return_type
{
	statement
};

//注:arg_type表示 参数类型 如:int double string
//    return_type   表示返回类型
//    statement     表示语句

接下来针对上例中 [ ] ( ) -> { }的作用和使用,来详细介绍

1. [ ] 外部变量的使用,可选符号 = &

lambda函数引用函数体外变量在 [ ] 方括号中实现
主要有以下几种形式:

[ ] 当为空时,表示外部变量,函数体内不能使用
[=] by value 只读数据,不能修改
[&] by reference 可以修改数据
[x,&y] 指定lambda函数内能使用的变量 x by value,y by reference
[=,&y] 指定y by reference 传进来,其它以by value传进来
[&x,&y,&z,…] 指定任意个外部变量 by reference 传进来
注释: 以上x,y是外部变量

注:以下常见错误

  1. [&y,=] //error &y指y by reference方式供lambda使用,而 = 又表示所有外部变量以by value方式传递,矛盾表达,这是最容易犯的错误,正确表达为 [=,&y]。
  2. [=x] //error =后不需接x 这个与&x不同,要谨记。

2.( ) lambda的参数

lambda函数的参数传递在 ( ) 小括号中实现
2.1 有参时,lambda定义; 例:

	[ ](char c){statement};

2.2 无参情况有以下3种情况;例:

	[ ](){statement};        //形式1   
	[ ]{statement};          //形式2
	[ ](void){statement};    //形式3

3.-> lambda返回值

有返回值时; 例:

 	[ ]()->int/double/...{...}; 

无返回值时 ;例:

	[ ](){...};              //形式1
	[ ]()->void{...};        //形式2

4.Lambda直接使用(新增2019.3.7)

方法1:

std::cout<<[](int a)-> int{return a; }(2);//在其后加上()可直接使用(解释:函数当然要有())

方法2:

auto f = [](int a)-> int{return a; };
std::cout<<f(2);

4.完整示例

示例:
#include <iostream>
#include <string>
int main()
{
    int x = 1;
    int y = 1;
    int z = 1;
    auto f = [x,&y](const std::string&str)->int{
    std::cout << "执行lambda" << std::endl;
    std::cout << str << std::endl;
    // x++;   		//by value不可修改
    // y=z+y  		// error ,z不能供使用
    y=x+y;   		//by reference 可修改
    return 1;
    };
    std::cout << "还未调用lambda" << std::endl << std::endl; 
    std::cout << f("你好")<<std::endl;
    std::cin.get();

解释:
1.上例中 x以by value 供lambda使用,不能改变x的值,y by reference供lambda使用,可以修改y的值,z不能被lambda使用 .
2.返回值为int型
3 参数为const string型,lambda不能修改str 值

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值