• C++ 指针函数和lambda


    #include <iostream>
    using namespace std;
    //函数指针,利用函数指针来优化程序
    bool div2(int n)
    {
        return n % 2 == 0;
    }
    
    void printfArray(int a[], size_t len, bool (*ptr)(int))
    {
        for(size_t i = 0;i < len;++i)
        {
            if(ptr(a[i]))
            {
                cout << a[i] << endl;
            }
        }
    }
    
    int main(void)
    {
    
       int a[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 0};
       printfArray(a, sizeof(a) / sizeof(a[0]), div2);
       system("pause");
       return 0;
    }
    

    lambda表达式本质上是一个函数

    {};

    capture{body};

    capture:捕捉外界的变量。如果捕获任意值则不能作为指针使用。捕获外界所有值:[=] 值传递 [&] 引用传递
    argument:参数
    body:函数体

    使用形式:

    auto fn = [](int n)->bool{ return n % 2 == 0;};
    fn(10);
    //或者
    [](int n)->bool{ return n % 2 == 0;}(100);
    

    例如:

    #include <iostream>
    using namespace std;
    //利用lamdab表达式进行排序
    int A(int n)
    {
        return n;
    }
    void sort(int a[], size_t len, int (*ptr)(int n))
    {
        for(size_t i = 0;i < len - 1;++i)
        {
            for(size_t j = i +1;j < len; ++j)
            {
                if(ptr(a[i]) > ptr(a[j]))
                {
                    int t = a[i];
                    a[i] = a[j];
                    a[j] = t;
                }
            }
        }
    }
    
    int main(void)
    {
        int a[10] = {1, -2, 4, 7, 5, -6, 8, 9, 0, 3};
        auto fn = [](int n){return n*n;};
        sort(a, sizeof(a) / sizeof(a[0]), fn);
        for(auto &x : a)
        {
            cout << x << endl;
        }
        system("pause");
        return 0;
    }
    
    
    //利用lamdab快速排序
    #include<cstdlib>
    #include <iostream>
    using namespace std;
    int main(void)
    {
        int a[10] = {1,2,3,4,5,6,7,8,9,0};
        ::qsort(a,sizeof(a)/sizeof(a[0]),sizeof(a[0]),[](void const *p1, void const *p2)->int
        {
            int *q1 = reinterpret_cast <int *>(const_cast <void *>(p1));   //void *p = nullptr; 是万能指针
            int *q2 = reinterpret_cast <int *>(const_cast <void *>(p2));   //将宽范围的往窄范围赋予,需要进行强制类型转换
            return *q1 - *q2;
    
        });
        for(auto &x : a)
        {
            cout << x << endl;
        }
    }
    

    this指针

    记住用法:
    ···C++
    void (Demo::*pfn)() = nullptr;
    pfn = &Demo::fn; //fn为成员函数

  • 相关阅读:
    【2020-01-28】陪伴即陪伴,擦汗即擦汗
    【2020-01-27】曼巴走了,但他还在
    【2020-01-26】今年,远亲不如近邻了
    【2020-01-25】新的一年,新的传统
    【2020-01-24】上天为这小女孩开了一扇小小窗
    【2020-01-23】故作假装的毛病
    day 31 html(二) 和css入门
    前端 day 30 html 基础一
    day 17python 面对对象之继承
    多并发编程基础 之协成
  • 原文地址:https://www.cnblogs.com/wsl540/p/13732967.html
Copyright © 2020-2023  润新知