c++基础(lambda)

作者 : 开心源码 本文共2067个字,预计阅读时间需要6分钟 发布时间: 2022-05-12 共259人阅读

Cplusplus-tutorial-in-hindi.jpg

在 c++ 中 lambda 函数有点相似匿名函数,怎样解释呢,我们无需定义一个函数结构随后再去使用这个函数。而是直接在使用时将其公告使用。

再进一步解释可以将函数赋值给变量,而后通过变量再去调用函数。我们学习一个新特性不是如何使用这个语法,而是在什么场景下恰当地去使用这个语法来处理实际问题。不要为了特效而改变故事情节,一个好的程序在其情节而不是特效。所以不要为了用而用。
lambda 是字面上定义一个函数而不是持有一个函数。也就是我们可以使用函数指针的场景是可以使用 lambda 来代替的。参照 c++ 基础(函数指针)

#include <iostream>#include <vector>#include <algorithm>void ForEach(const std::vector<int> &values, void (*func)(int)){    for (int value : values)        func(value);}int main(int argc, char const *argv[]){    std::vector<int> values = {1, 2, 3, 2, 1};    ForEach(values, [](int value) { std::cout << "value: " << value << std::endl; });    std::cin.get();}

定义void ForEach(const std::vector<int> &values, void (*func)(int))接收两个参数一个vector<int>动态数组,一个是指针函数作为参数。在调用函数ForEach时候第二个参数我们传入一个[](int value) { std::cout << "value: " << value << std::endl; }一个 lambda 作为第二参数传入到函数ForEach中。void (*func)(int)定义传入lambda的格式是返回值为void接收一个int类型的参数。
在循环体中的func(value)会调用lambda函数。

  • 注意以为c++11之后才对 lambda 进行支持,所以编译时候需要支持 c++11 进行编译。
g++ -std=c++11 lambda1.cpp -o lambda1
    auto lambda = [](int value) { std::cout << "value: " << value << std::endl; };    ForEach(values, lambda);

大家感觉陌生和疑惑可能是[],今天对这个解释一下,看了少量有关[]解释的参考资料,感觉和之前学习的 angularjs 中有关 directive 变量定义内部是对外的引用、还是复制的=,& 符号含义有点类似,这些符号主要传入到 directive 的变量是传值还是传引用。可能是 angularjs 设计者参考c++的做法了吧。

在 c++ 中[]lambda的捕获区,用于捕获外部变量,我们可以看一看。

int a = 5;    auto lambda = [=](int value) { std::cout << "value: " << a << value << std::endl; };
  • = 表示传值
  • & 表示传入引用
  • [&a] 表示传入 a 变量的引用,而[a]表示传入值。
void ForEach(const std::vector<int> &values, const std::function<void(int)> &func){    for (int value : values)        func(value);}int main(int argc, char const *argv[]){    std::vector<int> values = {1, 2, 3, 2, 1};    int a = 5;    auto lambda = [=](int value) { std::cout << "value: " << a << value << std::endl; };    ForEach(values, lambda);    std::cin.get();}

这里我们需要修改第二个参数传入的类型const std::function<void(int)> &func

 auto lambda = [=](int value) { a= 5; std::cout << "value: " << a << value << std::endl; };

假如想要在lambda表达式中修改传入的变量a,就需要使用 lambda 表达式中增加 一个mutable的说明符。

auto lambda = [=](int value) mutable { a= 6; std::cout << "value: " << a << value << std::endl; };

下面看一个 lambda 的具体应用,在algorithm库中提供了find_if 函数最后一个参数接收函数作为参数,我们可以传入一个 lambda 表达式来作为参数。

    auto it = std::find_if(values.begin(), values.end(), [](int value) { return value > 2; });    std::cout << *it << std::endl;

说明
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是摆设,本站源码仅提供给会员学习使用!
7. 如遇到加密压缩包,请使用360解压,如遇到无法解压的请联系管理员
开心源码网 » c++基础(lambda)

发表回复