• c++11特性(3)


    目录

    1.lambda表达式

     2.包装器(function)

    3.bind的用法


    1.lambda表达式

    a.出现由来:

    以sort为例,我们可以传入一个仿函数对自定义类型进行排序。但是,对每一种比较方式我们都要显示传一个仿函数太麻烦。要是乱命名更加要命,那就除了写这段代码的人没人看得懂了!

    b.lambda表达式的格式:

    []()->{} :[]是捕捉列表

                :()是参数列表

                 :->返回值类型

                 :{}函数体

    c.->返回值基本可以省去,可以自动推导。

    d.可以写无参数的lambda表达式,捕捉列表可以捕捉当前父作用域(当前栈帧)的所有变量。

    例:

    1. #include
    2. using namespace std;
    3. int main()
    4. {
    5. int a = 10; int b = 20;
    6. auto swap = [&a, &b]() {int temp; temp = a; a = b; b = temp; };
    7. //用&才可以传引用改变值
    8. swap();
    9. cout << a <<" "<< b << endl;
    10. return 0;
    11. }

       

     e.对于无参数的lambda表达式

    “=”表示将所有变量传值传入,“&”表示传地址,同时可以混用,例:

    1. #include
    2. using namespace std;
    3. int main()
    4. {
    5. int a = 10; int b = 20; int c = 30; int d = 40;
    6. auto fun = [=, &d]()
    7. {
    8. cout << a << endl;
    9. cout << b << endl;
    10. cout << c << endl;
    11. d = 50;
    12. cout << d << endl;
    13. };
    14. fun();
    15. return 0;
    16. }

    f.lambda表达式底层和仿函数完全一致


     2.包装器(function)

    顾名思义,包装器使用来将不同的函数指针或者lambda亦或者成员函数打包分类。

    上一个例题看看使用场景:

    题名:力扣(150. 逆波兰表达式求值)想看看的戳这里

    1. class Solution {
    2. public:
    3. int evalRPN(vector& tokens) {
    4. stack<long long> st;
    5. //不用function得搞一大堆判断
    6. maplong long(long long,long long)>> mp=
    7. {
    8. {"+",[](long long a,long long b){return a+b;}},
    9. {"-",[](long long a,long long b){return a-b;}},
    10. {"*",[](long long a,long long b){return a*b;}},
    11. {"/",[](long long a,long long b){return a/b;}}
    12. };
    13. for(auto& e:tokens)
    14. {
    15. if(mp.count(e))
    16. {
    17. //先取出的是右边的值
    18. long long right=st.top();
    19. st.pop();
    20. //再取出的是左边的值
    21. long long left=st.top();
    22. st.pop();
    23. //将出栈的两个数运算一下,再将结果存入栈当下一次运算的左值。
    24. long long ret=mp[e](left,right);
    25. st.push(ret);
    26. }
    27. else
    28. {
    29. st.push(stoll(e));
    30. }
    31. }
    32. //剩下的那个值就是结果
    33. return st.top();
    34. }
    35. };


    3.bind的用法

    bind在我看来就是为了将特定的函数参数固定。以对类的成员函数包装为例子,因为成员函数必须要实力对象才能调用,所以在不用bind的前提下,我们必须显示传一个匿名对象来调用该函数。

    1. class Sub
    2. {
    3. public:
    4. int sub(int a, int b)
    5. {
    6. return a - b;
    7. }
    8. };
    9. int main()
    10. {
    11. function<int(int, int)> funcSub = bind(&Sub::sub, Sub()//直接传一个匿名对象, _1, _2);
    12. int ret = funcSub(20, 5);
    13. cout << ret << endl;
    14. }

  • 相关阅读:
    linux应用之文件读取
    第二十章 多线程
    选择排序的3种语言实现方法(C java python)
    ThinkAutomation Crack
    2023年最牛的接口测试教程(文档+视频)
    Excel 语法
    Java基础---第十四篇
    MySql的初识感悟,以及sql语句中的DDL和DML和DQL的基本语法
    Mac M1芯片启动项目时出现 no zstd-jni in java.library.path 问题排查
    Java项目:SSM企业OA管理系统
  • 原文地址:https://blog.csdn.net/xiao_xiao21/article/details/127940148