zoukankan      html  css  js  c++  java
  • 什么是lamda表达式?

    我们首先来看一下这一片代码:

    1 class Solution {
    2 public:
    3     int singleNumber(int A[], int n) {
    4         // Note: The Solution object is instantiated only once and is reused by each test case.
    5         int retval = 0;
    6         for_each(A, A+n, [&retval](int val){retval ^= val;});
    7         return retval;
    8     }
    9 };

    看一下第六行的代码,for_each是C++用来处理container的一个很好用的东西(虽然只是经常用来print一下),第三个参数是个函数,对于前面的参数进行处理的函数。具体可以参考这里。

    http://www.cplusplus.com/reference/algorithm/for_each/

    第三个参数就是鼎鼎大名的lamda表达式了。楼主也是刚知道这是C++11的新特性,对于用着十年前教材的大学来说是肯定不会教的啦==

    简单来说,lamda表达式就是一个匿名函数。

    基本语法结构是[](){};

    其中[]是变量捕获列表,用来声明需要捕获的外部变量;

    ()是参数列表部分;

    {}是函数体部分。

    看个例子:

    [](int a, int b){ return a + b; };

    C++ Lamda表达式的参数列表中参数需要声明类型;函数体不能省略{}符号和return关键字;即使单条语句时也不能省略。

    显式声明需要捕获的外部变量,举个栗子:

    1 void HostingFunction()   
    2 {    
    3     int c = 1;    
    4     auto f = [c](int a, int b){ return a + b + c; };    
    5 }

    代码中声明了需要捕获外部变量c,则函数体中即可引用变量c,否则不能引用。不同于C# Lamda表达式,上述例子中对变量c的改变并不能影响f的行为,因为捕获的c是以值类型捕获的,也即是一份拷贝。如果对变量c采取按引用的方式捕获,则变量c的改变会影响f的行为。如下:

    1 void HostingFunction()   
    2 {    
    3     int c = 1;    
    4     auto f = [&c](int a, int b){ return a + b + c; };    
    5 }

    这个时候,我们就可以看懂文章最开始的代码了~

    1 int retval = 0;
    2 for_each(A, A+n, [&retval](int val){retval ^= val;});

    表示retval对于每个val进行异或操作。最后的结果保存在retval中。

    这个题目是:https://leetcode.com/problems/single-number/

    具体为什么要异或呢,大家想一想吧~~~

  • 相关阅读:
    深度学习中的基本概念——梯度相关
    模型训练中涉及到的技巧
    ubuntu swapfile
    ubuntu install opencv
    Jetson TX1 安装ROS操作系统
    Redis介绍以及安装(Linux)
    C# url信息获取
    贝茨视觉训练法
    PHP设计模式浅析
    MySQL相关知识
  • 原文地址:https://www.cnblogs.com/shenbingyu/p/4643822.html
Copyright © 2011-2022 走看看