【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;
    }
};

2. 使用仿函数进行排序

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

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

#include <iostream>
#include <algorithm>
#include <vector>

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;
}

在这里插入图片描述

3. 仿函数的灵活性

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

扫描二维码关注公众号,回复: 17153181 查看本文章

在这个示例中,我们创建了两个不同的仿函数,一个用于加法(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;
}

在这里插入图片描述

4. 标准库中的仿函数

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

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

#include <iostream>
#include <functional>

int main() 
{
    
    
    std::function<int(int, int)> myFunc = std::plus<int>(); // 使用标准库的仿函数
    int result = myFunc(5, 3); // 调用仿函数
    std::cout << "Result: " << result << std::endl;
    return 0;
}

在这里插入图片描述

5. 仿函数的使用场景

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

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

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

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

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

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

6. 函数对象适配器

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

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

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

7. 仿函数的性能

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

猜你喜欢

转载自blog.csdn.net/m0_74195626/article/details/133647762