lambda in C++【C++学习笔记】

本文介绍了C++中的lambda函数,包括其工作原理、简洁用法、捕获外部变量的方式,以及在`find_if`和`sort`等场景的应用。重点讲解了lambda作为函数指针的替代,并演示了值传递和引用传递的区别。
摘要由CSDN通过智能技术生成

59.lambda in C++

lambda本质上是我们定义的一种叫做匿名函数的方式。我们可以用这种方式简易的创建一个函数,而不需要真的实际创建一个函数,就像一个快速的一次性函数

lambda更像是一种变量,在实际编译的代码中作为一个符号存在,而不是像正式的函数那样。

🍅lambda用法

只要你有一个函数指针,你都可以在C++中使用lambda,这就是它的工作原理

故lambda的用法是:在设置函数指针指向函数的任何地方,我们都可以将他设置未lambda

[]( {参数表} ){ 函数体 }

void ForEach(const std::vector<int>& values, void(*function)(int)) {
    for (int temp : values) {
        function(temp);		//正常调用lambda函数
    }
}

int main() {
    std::vector<int> valus = { 1, 2, 3, 4, 5 };
    //函数指针的地方都可以用auto来简化操作,lambda亦是
    //这样子来定义lambda表达式会更加清晰明了
    auto lambda = [](int val){ std::cout << val << std::endl; }
    ForEach(values, lambda);	
}

lambda中的中括号表示的是捕获

  • lambda可以使用外部(相对)的变量,而[]就是表示打算如何传递变量

    #include <functional>	//要用捕获就必须要用C++新的函数指针!
    //新的函数指针的签名有所不同!
    void ForEach(const std::vector<int>& values, const std::function<void(int)>& func) {
        for (int temp : values) {
            func(temp);		
        }
    }
    
    int main() {
        std::vector<int> valus = { 1, 2, 3, 4, 5 };
        //注意这里的捕获必须要和C++新带的函数指针关联起来!!!
        int a = 5;	//如果lambda需要外部的a向量
        //则在捕获中写入a就好了
        auto lambda = [a](int val){ std::cout << a << std::endl; }
        ForEach(values, lambda);	
    }
    

    注意这里[a]是值传递,如果是[&a]就是引用传递

    • 💡如果是[=],则是将所有变量值传递到lambda中
    • 💡如果是[&],则是将所有变量引用传递到lambda中
  • 它可以有0个或者多个捕获

  • (捕获区域)能够传入变量(可作为拷贝or引用or值被捕获

🍅为何想用lambda

**find_if**是一个搜索类的函数,区别于find的是:它可以接受一个函数指针来定义搜索的规则,返回满足这个规则的第一个元素的迭代器。这个情况就很适合lambda表达式的出场了

#include <functional>	//要用捕获就必须要用C++新的函数指针!
//新的函数指针的签名有所不同!
#include <algorithm>

void ForEach(const std::vector<int>& values, const std::function<void(int)>& func) {
    for (int temp : values) {
        func(temp);		
    }
}

int main() {
    std::vector<int> valus = { 1, 2, 3, 4, 5 };
    //下面就用到了lambda作为函数指针构成了find_it的规则
    auto it = std::find_if(values.begin(), values.end(), [](int value) { return value > 3; });	//返回第一个大于3的元素的迭代器 
    std::cout << *it << std::endl;	//将其输出
}

如果是这样的话,对于sort也不必要去大老远写一个cmp了,直接写一个lambda表达式就可以了👌

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值