c++基础(lambda)
来源:zidea     阅读:454
源码超市
发布于 2019-06-11 03:41
查看主页
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函数。

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; };
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;
免责声明:本文为用户发表,不代表网站立场,仅供参考,不构成引导等用途。 系统环境 服务器应用
相关推荐
「转」Yahoo团队网站性能优化的35条黄金守则(值得你收藏)
CentOS6.4安装Zookeeper-3.4.12
暗黑模式?安卓适配一波
前台干货:用原生js写一个弹窗消息提示插件
spring cloud 笔记 |第一章: Eureka 服务的注册与发现框架
首页
搜索
订单
购物车
我的