仿函数(Functor)是一种可调用对象,可以像函数一样使用。它可以被视为函数对象,具有类似函数的特性。仿函数可以被用于算法、容器等需要接受可调用对象的场景。与普通的函数相比,仿函数可以保存状态,并且可以方便地进行函数对象的组合、适配和扩展。
仿函数常常通过重载()运算符(函数调用运算符)来实现,从而使得对象可以像函数一样被调用。通过重载()运算符,仿函数可以接受参数并返回结果。例如:
```cpp
struct Add {
int operator()(int a, int b) {
return a + b;
}
};
int main() {
Add add;
int result = add(3, 4);
// result = 7
return 0;
}
```
在上面的例子中,Add是一个仿函数,它重载了()运算符,使得对象add可以像函数一样被调用。add(3, 4)的结果是7。
仿函数除了可以像函数一样被调用,还可以保存状态。这意味着,当重复调用仿函数时,它可以记住之前的状态。这在某些场景下非常有用。例如:
```cpp
struct Counter {
int count = 0;
void operator()() {
count++;
}
};
int main() {
Counter counter;
counter(); // count = 1
counter(); // count = 2
counter(); // count = 3
return 0;
}
```
在上面的例子中,Counter是一个仿函数,它记录了count的值,并且在每次调用时将count加1。每次调用counter(),count的值会增加。
仿函数还可以作为参数传递给算法函数,以及用于容器的元素访问和修改等操作。这使得代码更加灵活和可复用。
除了自定义的仿函数,C++标准库还提供了一些内置的仿函数,例如std::plus、std::minus等,可以在<functional>头文件中找到它们,以便于快速使用。
总结来说,仿函数是一种可调用对象,可以像函数一样被调用,可以保存状态,并且具有更高的灵活性和可复用性。它在算法、容器等各种场景中都非常有用。