zoukankan      html  css  js  c++  java
  • lambda表达式(c++11)

    1.概念

    1)lambda表达式是一个可调用的代码单元,它由一个捕获列表、一个参数列表、一个箭头、一个返回类型、一个函数体组成:

    2)可以忽略参数列表和返回类型,但必须包含捕获列表和函数体

    3)忽略参数列表:参数列表可以忽略,捕获列表不可以忽略,也就是说“()”可以忽略,“[]”不可以忽略

    4)忽略返回类型:

    • 忽略返回类型同时也会忽略那个箭头
    • 如果lambda表达式的函数体只是一个单一的return语句,则返回类型可从return的表达式的类型来推断
    • 如果lambda表达式的函数体除了单一的return语句还有别的内容,则默认返回void
    • 单一的return语句包括带有条件运算符"?"的return语句,但不包括带有 if/else 条件判断的return语句

    5)底层实现原理:仿函数

    2.捕获列表

    1)捕获列表一般为空,可以存放局部变量,来指出lambda会使用这些局部变量

    2.1值捕获

      对局部变量采取拷贝的方式进行捕获,需要注意的是,是在创建lambda时拷贝,而不是使用lambda时:

    2.2引用捕获

       对局部变采取引用的方式进行捕获,此时必须保证被引用的对象在lambda执行时是存在的(函数返回lambda时,这个lambda就不能使用引用捕获)。为什么需要引用捕获?因为有些局部变量不能被拷贝:

      ostream对象不能被拷贝

    2.3隐式捕获

      =告诉编译器使用值捕获,&告诉编译器使用引用捕获:

      也可以混合使用隐式捕获和显示捕获,此时捕获列表中第一个位置必须是隐式捕获。

    3.可变lambda

    1)对于值捕获:默认情况下,lambda不会改变其值,但是如果希望改变,则需要在参数列表后面加上关键字mutable:

    2)对于引用捕获:如果是const变量的引用,则不能改变它;如果是非const变量的引用,则可以改变

    4.指定lambda的返回类型

      函数体有单一的return语句,我们无须指定返回类型,但是遇上显式的if/else条件判断有多个return语句的时候,就必须指定了:

    5.标准库函数对象(非c++11)

      可以使用标准库定义的一些函数对象来充当泛型算法的谓词:

    标准库定义的这些函数对象对指针同样适用(正常方法去比较两个不相关的指针是错误的):

    在这里,是想要通过比较指针的它自己的地址来排序这个存有指针的vector。

  • 相关阅读:
    模板
    总结
    关于log方线段树
    [ICPC2014 WF]Sensor Network
    背包问题总结
    NOIP2020微信步数
    NOIP2020移球游戏
    CF643D Bearish Fanpages
    CF685C Optimal Point
    论恋爱对学习的促进作用
  • 原文地址:https://www.cnblogs.com/Joezzz/p/9728607.html
Copyright © 2011-2022 走看看