一、仿函数的定义
仿函数(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;
}