请注意标题是函子(不是函数)!
考虑一个函数,它只有一个参数。但是,在调用此函数,我们有很多信息希望传递给此函数,但由于它仅接受一个参数,因此我们不能。该怎么办?
一个明显的答案可能是全局变量。但是,良好的编码习惯并不主张使用全局变量,而是说只有在没有其他选择时才必须使用它们。
函子是可以被视为函数或函数指针的对象。在以下情况下,函子最常与STL一起使用:
下面的程序在STL中使用transform()向arr []的所有元素加1。
// A C++ program uses transform() in STL to add
// 1 to all elements of arr[]
#include
using namespace std;
int increment(int x) { return (x+1); }
int main()
{
int arr[] = {1, 2, 3, 4, 5};
int n = sizeof(arr)/sizeof(arr[0]);
// Apply increment to all elements of
// arr[] and store the modified elements
// back in arr[]
transform(arr, arr+n, arr, increment);
for (int i=0; i
输出:
2 3 4 5 6
此代码段仅向arr []的内容添加一个值。现在假设,我们想在arr []的内容上加5。
看看发生了什么事?由于transform需要一个数组的一元函数(一个函数仅接受一个参数),因此我们无法将数字传递给增量()。实际上,这将使我们编写几个不同的函数来添加每个数字。真是一团糟。这是函子开始使用的地方。
函子(或函数对象)是一种C++类,其作用类似于函数。使用相同的旧函数调用语法来调用函数。要创建函子,我们创建一个使运算符()重载的对象。
The line,
MyFunctor(10);
Is same as
MyFunctor.operator()(10);
让我们深入研究并了解如何将其实际与STL结合使用。
// C++ program to demonstrate working of
// functors.
#include
using namespace std;
// A Functor
class increment
{
private:
int num;
public:
increment(int n) : num(n) { }
// This operator overloading enables calling
// operator function () on objects of increment
int operator () (int arr_num) const {
return num + arr_num;
}
};
// Driver code
int main()
{
int arr[] = {1, 2, 3, 4, 5};
int n = sizeof(arr)/sizeof(arr[0]);
int to_add = 5;
transform(arr, arr+n, arr, increment(to_add));
for (int i=0; i
输出:
6 7 8 9 10
因此,在这里,增量是一个仿函数,一个C++类充当函数。
The line,
transform(arr, arr+n, arr, increment(to_add));
is the same as writing below two lines,
// Creating object of increment
increment obj(to_add);
// Calling () on object
transform(arr, arr+n, arr, obj);
因此,创建了一个对象a ,该对象使运算符()重载。因此,函子可以有效地与C++ STL结合使用。
要从最佳影片策划和实践问题去学习,检查了C++基础课程为基础,以先进的C++和C++ STL课程基础加上STL。要完成从学习语言到DS Algo等的更多准备工作,请参阅“完整面试准备课程” 。