• 【C++】关于仿函数


    C++中的 仿函数(Functor)是 一种可以像函数一样被调用 对象

    仿函数是STL中的重要概念之一,可以用于 实现自定义的比较、排序、映射等操作,使代码更具灵活性和可重用性。

    1. 仿函数的基本概念

    仿函数是一个类或结构体,它重载了operator()运算符,使其可以像函数一样被调用。

    仿函数的实例可以像函数指针一样传递给STL算法或容器的操作,从而实现自定义行为。

    比如下面这个,Less是一个仿函数,它接受两个参数并返回"<"比较的结果。

    template<class T>
    class Less 
    {
    public:
        bool operator()(const T& x, const T& y) 
        {
            return x < y;
        }
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    2. 使用仿函数进行排序

    仿函数常用于STL中的排序操作,例如std::sort()函数

    下面示例中,Greater是一个仿函数,它在std::sort中用于指定降序排序

    #include 
    #include 
    #include 
    
    class Greater
    {
    public:
        bool operator()(int a, int b) 
        {
            return a > b; // 排降序
        }
    };
    
    int main() {
        std::vector<int> vec = {3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 10};
        Greater cmp;
        std::sort(vec.begin(), vec.end(), cmp);
    
        for (int num : vec) {
            std::cout << num << " ";
        }
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23

    在这里插入图片描述

    3. 仿函数的灵活性

    仿函数 可以具有任意数量的参数,并可以用于各种不同的操作。这使得它们非常灵活,可以根据需要进行定制

    在这个示例中,我们创建了两个不同的仿函数,一个用于加法(MyAdditionFunc),一个用于减法( MySubtractionFunc ),它们可以根据需要进行切换。

    class MyAdditionFunc 
    {
    public:
        int operator()(int a, int b) 
        {
            return a + b;
        }
    };
    
    class MySubtractionFunc 
    {
    public:
        int operator()(int a, int b) 
        {
            return a - b;
        }
    };
    
    int main() 
    {
        MyAdditionFunc add;
        MySubtractionFunc subtract;
    
        int result1 = add(5, 3);        // 8
        int result2 = subtract(5, 3);   // 2
    
        std::cout << "Result of addition: " << result1 << std::endl;
        std::cout << "Result of subtraction: " << result2 << std::endl;
    
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31

    在这里插入图片描述

    4. 标准库中的仿函数

    STL中已经提供了一些常用的仿函数,例如std::lessstd::greaterstd::plusstd::minus等,它们可以在不编写自定义仿函数的情况下直接用

    这里我们用std::plus()来创建一个加法仿函数,并将其存储在std::function对象中,然后可以像函数一样去调用它。

    #include 
    #include 
    
    int main() 
    {
        std::function<int(int, int)> myFunc = std::plus<int>(); // 使用标准库的仿函数
        int result = myFunc(5, 3); // 调用仿函数
        std::cout << "Result: " << result << std::endl;
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    在这里插入图片描述

    5. 仿函数的使用场景

    仿函数在 STL中的许多算法和容器中都有广泛的应用,以下是一些常见的使用场景:

    ① 排序算法:如前面示例中的std::sort,可以使用自定义的仿函数来指定元素的排序方式。

    ② 查找算法:如std::find_if,可以使用仿函数来定义查找条件。

    ③ 容器适配器:在实现自定义容器适配器时,仿函数可以 用于定义元素的比较方式,例如实现一个自定义的堆栈或队列。

    ④ 关联容器:在关联容器(如std::mapstd::set)中,可以使用仿函数来定义元素的排序方式或比较规则。

    ⑤ 自定义算法:在实现自己的算法时,仿函数可以用于定义算法的核心操作,懂得都懂。在这里插入图片描述

    6. 函数对象适配器

    STL还提供了一些函数对象适配器,它们用于将普通函数指针、仿函数或成员函数适配成满足特定要求的仿函数。这些适配器 增强了仿函数的灵活性,使其能够满足更多不同的需求
    例如:
    std::bind:用于部分应用函数,可以将函数的一部分参数绑定到固定值。

    std::function:是一种通用的函数封装,可以存储和调用各种可调用对象,包括仿函数。

    std::mem_fn:用于将成员函数适配成仿函数,允许在对象上调用成员函数。

    7. 仿函数的性能

    在某些情况下,使用仿函数可能会导致性能开销,因为它们引入了额外的函数调用。与普通函数相比,仿函数可能会有一些微小的性能损失。但在 绝大多数情况下,这种性能损失非常小,通常可以忽略不计。在性能要求非常高的特定应用中,可以使用内联函数或其他优化手段来减小性能损失。

  • 相关阅读:
    跨境电商运营的新趋势:自养号测评补单技术解析
    做了5年自媒体,总结下自媒体短视频不会内容创造怎么办?
    java+springboot+vue水果蔬菜篮子商城经营平台系统
    概念澄清:如何直接拿到promise的返回值
    Machine Learning With Go 第4章:回归
    MATLAB算法实战应用案例精讲-【图像处理】机器视觉(应用篇)
    [C][文件操作][一][文件指针][文件的打开与关闭][文件的顺序读取接口]详细讲解
    nvm详解(mac环境nvm安装步骤及踩坑问题)
    黑马2021最新版 SpringCloud基础篇全技术栈导学(RabbitMQ+Docker+Redis+搜索+分布式)
    python中赋值、浅拷贝、深拷贝的区别,几张图片让你学会
  • 原文地址:https://blog.csdn.net/m0_74195626/article/details/133647762