C++:lambda表达式

74 篇文章 2 订阅
56 篇文章 0 订阅

Lambda函数是C++ 11中引入的现代C++的一个直观概念。使用lambda表达式可编写内嵌的匿名函数。而不必编写独立函数或函数对象,使代码更容易阅读和理解。

Lambda语法

lambda表达式以方括号[]开始(这称为lambda引入符),其后是花括号{},其中包含lambda表达式体。lambda表达式被赋予自动类型变量basicLambda。第二行使用普通的函数调用语法执行lambda表达式。

auto basicLambda = [ ] { cout << "Hello from Lambda" << endl; };

basicLambda();

输出如下所示:

Hello from Lambda

lambda表达式可以接收参数。参数在圆括号中指定,用逗号隔开,与普通函数相同。下面是使用参数的示例:

auto parameterLambda =

    [ ] (int value) { cout << "The value is " << value << endl; };

parameterLambda (42);

如果lambda表达式不接收函数,就可指定空圆括号或忽略它们。

lambda表达式可返回值。返回类型在箭头后面指定,称为拖尾返回类型。下例定义的lambda表达式接收两个参数,返回它们的和:

auto returningLambda = [ ] (int a, int b) -> int {return a + b; };

int sum = returningLambda(11, 22);

Capture(用以访问外部作用域)

在lambda introducer (每个lambda最开始的方括号)内,你可以指定一个capture用来处理外部作用域内未被传递为实参的数据:

  • [=] 意味着外部作用域以by value方式传递给lambda。
  • [&] 意味着外部作用域以by reference方式传递给lambda。
#include <iostream>
#include <string>

int main()
{
	int x=0;
	int y=42;
	auto qqq  = [x, &y] {
	    std::cout << "x: " << x << std::endl;
	    std::cout << "y: " << y << std::endl;
	    ++y;
        //++x; Not Ok
	    };
	x = y = 77;
	qqq();
	qqq();
	std::cout << "final x: " << x << std::endl;
	std::cout << "final y: " << y << std::endl;

	return 0;
}

会产生以下输出: 

kent@ubuntu:~/source/lambda$ ./a.out
x: 0
y: 77
x: 0
y: 78
final x: 77
final y: 79

 由于x是因by value而获得一份拷贝,在此labmda内部你可以改动它,但若调用++x是通不过编译的。y以by reference方式传递,所以你可以涂写它,并且其值的变化会影响外部;所以调用这个labmda二次,会使指定值77被累加。

kent@ubuntu:~/source/lambda$ g++ lambda.cpp
lambda.cpp: In lambda function:
lambda.cpp:12:5: error: increment of read-only variable ‘x’
   ++x;
     ^

你也可以写[=, &y]取代[x, &y],意思是以by reference方式传递y,其他所有实参则以by value方式传递。

为了获得passing by value和passing by reference混合体,你可以声明labmda为mutable。下例中的对象都以by value方式传递。但在这个lambda所定义的函数对象内,你有权力涂写传入的值。例如:

#include <iostream>
#include <string>

int main()
{
	int id=0;
	auto f  = [id] () mutable {
	    std::cout << "id: " << id << std::endl;
	    ++id;   //OK
	    };
	id = 42;
	f();
	f();
    f();
	std::cout << "id: " << id << std::endl;

	return 0;
}

 会产生以下输出: 

kent@ubuntu:~/source/lambda$ ./a.out
id: 0
id: 1
id: 2
id: 42

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Lambda表达式C++11引入的一种函数对象,可以在需要函数对象的地方使用,比如作为函数参数、返回值等。Lambda表达式的语法形式如下: ``` [capture list](parameters) mutable exception -> return type { // function body } ``` 其中,`capture list` 表示捕获列表,用于捕获外部变量。`parameters` 表示函数参数列表,`mutable` 用于表示是否可以修改值传递的变量,`exception` 是异常列表,`return type` 表示返回类型,`function body` 则是函数体。 在Lambda表达式中,可以通过 `[this]` 捕获当前对象的指针,即 `this` 指针,可以方便地访问当前对象的成员变量和成员函数。例如: ``` class MyClass { public: void foo() { int x = 1; auto lambda = [this, x]() mutable { this->m_member_var += x; this->m_member_function(); x++; }; lambda(); } private: int m_member_var; void m_member_function(); }; ``` 在上面的例子中,Lambda表达式通过 `[this, x]` 捕获了当前对象的指针和 `foo()` 函数中定义的变量 `x`。在 Lambda 表达式中可以通过 `this->m_member_var` 和 `this->m_member_function()` 访问当前对象的成员变量和成员函数。由于 `x` 是值传递的,所以在 Lambda 表达式中需要使用 `mutable` 关键字使其可修改,可以通过 `x++` 修改变量的值。最后调用 `lambda()` 执行 Lambda 表达式。 需要注意的是,Lambda表达式捕获 `this` 指针时,需要保证当前对象是有效的,即不能在已经销毁的对象中访问成员变量和成员函数

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

AllenSun-1990

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值