• C++:函数指针进阶(三):Lambda函数详解


    1:Lambda函数语法

    C++ 语法的基本格式为:

    [capture](parameters) -> return_type { /* ... */ }

    (1) [capture] :[]内为外部变量的传递方式,值、引用等,如下

    []        //表示的是在lambda定义之前的域,对外部参数的调用;
    [=]       //表示外部参数直接传值
    [&]       //表示外部参数传引用,可修改值。当默认捕获符是 & 时,后继的简单捕获符必须不以 & 开始。而当默认捕获符是 = 时,后继的简单捕获符必须以 & 开始。
    [x, &y]   //x is captured by value, y is captured by reference
    [&, x]    //x is explicitly captured by value. Other variables will be captured by reference
    [=, &z]   //z is explicitly captured by reference. Other variables will be captured by value
     

    (2)(parameters) :()内为形参,和普通函数的形参一样。

    (3)-> return_type:->后面为lambda函数的返回类型,如 -> int-> string等。一般情况下,编译器推出lambda函数的返回值,所以这部分可以省略不写。

    (4){ /* … */ }:   {}内为函数主体,和普通函数一样。

    举例:定义 lambda函数

    auto add = [](int a,int b) ->int {  return a + b;   };
    此处为 lambda函数定义,所以左边为函数指针类型变量,一般懒的写函数指针类型,可以直接赋值给 auto类型变量。

    lambda函数使用、运行

    方法一:直接用 auto 变量接收 lambda函数返回值

    auto add = [](int a,int b) ->int return a + b;   };

    int result  = add(1,2);

    方法二:定义函数指针接收 lambda函数返回值

    auto add = [](int a,int b) ->int {  return a + b;   };
    int(*func_ptr)(int,int) = add ;
    int result = func_ptr(1,2);

     2:Lambda表达式应用实例

    lambda表达式原理: 就是函数对象更高级的实现!

    现在我们看一下:通过 Lambda表达式对 Vector进行排序

    1. // main.cpp
    2. #include
    3. #include
    4. #include
    5. int main() {
    6. std::vector<int> vec;
    7. for (int i = 0; i < 3; i++)
    8. {
    9. vec.push_back(i);
    10. }
    11. // 定义lambda比较器传给 sort函数做比较.做降序排列(注意 sort函数默认阿是升序排列的)
    12. std::sort(vec.begin(), vec.end(), [](int a, int b)->bool {
    13. return a > b;
    14. });
    15. //打印比较后的结果
    16. for (int val : vec) {
    17. std::cout << val << std::endl;
    18. }
    19. }
    20. // 打印结果
    21. 2
    22. 1
    23. 0

    总结:前两篇我们分析了:函数指针,函数对象指针,Lambda表达式用法,这三种情况下,其实代码还是比较繁琐复杂的,那么我们可以想一下,是否可以有一种简单的技术,来把这些情况都包含起来了 ?按照面向对象的思想,来处理这些情况了 ? 有的,C++中  std::function 这个类就是可以实现。

    std::function是C++标准库中的一个模板类,用来保存一个函数、仿函数或lambda表达式。

    好,下篇文章我们就分析 C++ 标准库中 这个模板类。

  • 相关阅读:
    We’re sorry but XXX doesn’t work properly without JavaScript enabled(解决方案汇总)
    15.操作系统死锁处理
    杰理之BLE优化原理【篇】
    【干货】连肝7个晚上,总结了关于Java基础的16个问题!
    Socks5代理、IP代理的关键作用
    Python爬虫教程:解析网页中的元素
    轴承故障诊断(一维时序信息结合二维图像实现故障诊断,python编程,十分类)
    快速入门 git 代码版本管理工具(03)
    ARM Cortex-M 的 SP
    01-自动内存管理机制
  • 原文地址:https://blog.csdn.net/u013620306/article/details/128053497