C++11新宠-Lambda函数学习

本文介绍了C++11引入的Lambda函数,它源自lambda calculus,简化了临时函数的创建,尤其在标准库算法中作为谓词函数使用。Lambda表达式包括捕获列表、参数表、函数选项、返回类型和函数体,允许直接访问并修改外部变量。通过示例和比较函数指针、函数符,展示了Lambda函数的优势和用法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Lambda背景

  • Lambda来自lambda calculus(λ演算,如果有兴趣,可以看这篇文章http://cgnail.github.io/academic/lambda-1/)——一种定义和应用函数的数学系统。
  • Lambda 表达式之所以是 C++ 11 新增特性中最激动人心的一个,究其原因是其在距离、简洁、效率和功能上都让人耳目一新。引入的主要目的是让你能够将类似于函数的表达式用作接受函数指针或函数符的函数的参数。大部分人可能会被这句话绕晕,简单的说就是把运算过程尽量写成一系列嵌套的函数调用。
  • 标准 C++库中有一个常用算法的库,其中提供了很多算法函数,比如 sort() 、find()、count_if()等。这些函数通常需要提供一个“谓词函数 predicate function”。所谓谓词函数,就是进行一个操作用的临时函数。比如 find() 需要一个谓词,用于查找元素满足的条件;能够满足谓词函数的元素才会被查找出来。这样的谓词函数,使用临时的匿名函数,既可以减少函数数量,又会让代码变得清晰易读。

Lambda简介

重点来啦!!
lambda表达式的语法归纳如下:
[ caputrue ] ( params ) opt -> ret { body; };
1. capture是捕获列表;
2. params是参数表;(选填)
3. opt是函数选项;可以填mutable,exception,attribute(选填)
(a)mutable说明lambda表达式体内的代码可以修改被捕获的变量,并且可以访问被捕获的对象的non-const方法。
(b)exception说明lambda表达式是否抛出异常以及何种异常
(c)attribute用来声明属性。
4. ret是返回值类型。(选填)
5. body是函数体。
捕获列表:lambda表达式的捕获列表精细控制了lambda表达式能够访问的外部变量,以及如何访问这些变量。

符号 含义
[] 不捕获任何变量
[&] 捕获外部作用域中所有变量,并作为引用在函数体中使用(引用传递)
[=] 捕获外部作用域中所有变量,并作为副本在函数体中使用(值传递)。
[=,&foo] 按值捕获外部作用域中所有变量,并按引用捕获foo变量。
[bar] 按值捕获bar变量,同时不捕获其他变量。
[this] 捕获当前类中的this指针,让lambda表达式拥有和当前类成员函数同样的访问权限。如果已经使用了&或者=,就默认添加此选项。捕获this的目的是可以在lamda中使用当前类的成员函数和成员变量。

Lambda的程序示例

#include <vector>
#include "iostream"
#include <algorithm>
#include <functional>
//由浅到深,循序渐进的感受lambda的神奇之处,相信会为你的程序增加亮点,同时也希望各位批评指正。
void lambda_one() {
    std::cout << std::endl << "----------没有函数参数的lambda---------" << std::endl;
    auto fun = []() {};
    auto fun1 = []() { std::cout << "fun1" << std::endl; };
    fun1();

    std::cout << std::endl << "--------for_each中使用简单的lambda------" << std::endl;
    std::vector<int> v(3, 5);
    for_each(v.begin(), v.end(), [](int num) { std::cout << num << "\t"; });

    std::cout << std::endl << "---------设置lambda的返回值类型--------" << std::endl;
    std::cout << [](double a, double b) { return a + b; }(1.4, 2.5) << std::endl;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值