仿函数(C++)

一、仿函数的定义

        仿函数(Functor),也称为函数对象,是一种可以像函数一样被调用的对象。在 C++ 中,仿函数不是函数,它本质上是重载了函数调用运算符()的类。这使得类的对象可以像函数一样传参使用,它能够在一些特定的场景下提供比普通函数更灵活的功能。

 二、示例

以下是一个简单的仿函数示例:

class Add 
{
public:
    int operator()(int a, int b) 
    {
        return a + b;
    }
};

在这个例子中,Add是一个类,它重载了()运算符。可以像下面这样使用这个仿函数:

Add a;
int result = a(3, 5);  // 相当于调用addObj.operator()(3, 5);
std::cout << result << std::endl; 

 三、仿函数的用法

用该仿函数讲解操作(计算平方):

class Square 
{
public:
    int operator()(int x) 
    {
        return x * x;
    }
};

1.作为参数传递

        仿函数可以作为参数传递给其他函数。例如,有一个函数模板,用于对数组中的每个元素应用一个操作:

   template <typename T, typename Functor>
   void applyFunction(T arr[], int size, Functor func) {
       for (int i = 0; i < size; ++i) {
           arr[i] = func(arr[i]);
       }
   }

 可以使用之前定义的Square仿函数来调用这个函数模板:

int main() 
{
	int numbers[] = { 1, 2, 3, 4, 5 };
	int size = sizeof(numbers) / sizeof(numbers[0]);
	applyFunction(numbers, size, Square());
	for (int i = 0; i < size; ++i) 
	{
		std::cout << numbers[i] << " ";
	}
	return 0;
}

         这里applyFunction函数接受一个数组、数组大小和一个仿函数。在函数内部,通过调用仿函数对数组中的每个元素进行操作。

2.在 STL 的算法中的使用

        在 C++ 标准模板库(STL)的许多算法中,仿函数发挥着重要作用。例如,std::sort算法可以使用自定义的比较仿函数来实现特定的排序规则。假设要对一个包含自定义结构体的vector进行排序。定义一个结构体Person

struct Person 
{
       int age;
       std::string name;
};

 并定义一个比较仿函数来按照年龄对Person结构体进行排序:

struct ComparePersonByAge 
{
    bool operator()(const Person& p1, const Person& p2) 
    {
        return p1.age < p2.age;
    }
};

 然后可以在std::sort中使用这个仿函数:

  int main() {
       std::vector<Person> people;
       // 假设people已经填充了Person结构体
       std::sort(people.begin(), people.end(), ComparePersonByAge());
       return 0;
   }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值