• 函数对象和函数指针


    1. 定义:
        函数对象:所有重载了函数调用操作符(operator())的类对象,又称为函数子。在STL中,大多数使用函数子的地方都可以使用函数指针(ps:set和multiset的比较类型必须是函数对象,而不能是函数指针)通过将operator设置为内联函数,可以使程序性能加速。
        函数指针:指向某种(函数参数,返回值)的函数类型的指针,每个函数都有一个入口地址,函数指针便是指向了函数的入口地址。通过将函数指针传入函数中,方便一个函数调用另一类型的函数。如: int GetMaxValue( double x, bool (*ptr)(int, int) ),其中ptr即为函数指针。 
         c++中这样使用函数指针:
    bool greaterNum(int x, int y)
    {
        return x>y;
    }                 
    using PF = bool (*)(int, int);  //或typedef int (*PF)(int, int);
    PF pf = greaterNum;
    cout<<pf(4,10)<<endl; //输出为0
    2. 例子:
        使用函数指针和函数对象作为STL中sort的参数,实#include <iostream>
    #include <vector>
    #include <algorithm>
    #include <functional>
    
    using namespace std;
    
    template<typename T>
    class GreaterNum : public binary_function<T, T, bool>
    {
    public:
        inline bool operator()(T x, T y)
        {
            return x>y;
        }
    };
    
    bool greaterNum(int x, int y)
    {
        return x>y;
    }
    
    void print(int x)
    {
        cout<<x<<" ";
    }
    
    int main()
    {
        vector<int> v1 = {21,6,21,4,2,1,45,6,1,7,9,5,2};
        auto v2 = v1;
        /*使用函数对象为第三个参数*/
        sort( v1.begin(), v1.end(), GreaterNum<int>() );
        for_each(v1.begin(), v1.end(), print);
        cout<<endl;
        /*使用函数指针为第三个参数*/
        sort( v2.begin(), v2.end(), greaterNum );
        for_each(v2.begin(), v2.end(), print);
        
        return 0;
    }
    3. 函数对象的优势:
        (1)函数对象通过重载()实现,那么将operator()函数设置为内联函数,可以提高程序的运行速度。如上面的例子,相比于传入greaterNum函数指针为sort的第三个形参,传入是GreaterNum<int>函数子时,程序运行的速度快。因为内联函数在编译时展开,而函数指针要进行调用。
        (2)函数对象可以携带附加信息,如类的其他数据成员,而函数指针则做不到。
  • 相关阅读:
    升/降压转换器 (Buck-boost)
    升压转换器 (Boost)
    降压转换器 (Buck)
    线性稳压器 (LDO)
    电源管理组件选择指南
    AC/DC 反激 (Flyback) 控制器
    SEPIC 单端初级电感转换器 稳压器 -- Zeta 转换器
    LT3759 宽输入电压范围升压 / 负输出 / SEPIC 控制器 可在输入电压低至 1.6V 的情况下工作
    LT1961 升压型稳压器造就了兼具升压和降压能力的扁平状SEPIC
    Level-shifting nixes need for dual power supply
  • 原文地址:https://www.cnblogs.com/ladawn/p/8318819.html
Copyright © 2020-2023  润新知