请注意标题是函子(不起作用)!!
考虑一个仅接受一个参数的函数。但是, 在调用此函数时, 我们有很多信息希望传递给该函数, 但由于它仅接受一个参数, 因此我们不能。该怎么办?
一个明显的答案可能是全局变量。但是, 良好的编码习惯并不主张使用全局变量, 而是说只有在没有其他选择时才必须使用它们。
函子是可以被视为函数或函数指针的对象。在以下情况下, 函子最常与STL一起使用:
以下程序用途STL中的transform()将arr []的所有元素加1。
// A C++ program uses transform() in STL to add
// 1 to all elements of arr[]
#include <bits/stdc++.h>
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<n; i++)
cout << arr[i] << " " ;
return 0;
}
输出如下:
2 3 4 5 6
此代码段仅向arr []的内容添加一个值。现在假设, 我们想在arr []的内容上加5。
看看发生了什么事?由于transform要求数组使用一元函数(一个仅接受一个参数的函数), 因此我们无法将数字传递给increment()。实际上, 这将使我们编写几个不同的函数来添加每个数字。真是一团糟。这是函子开始使用的地方。
函子(或函数对象)是一种类似于函数的C ++类。使用相同的旧函数调用语法来调用函子。要创建函子, 我们创建一个使运算符().
The line, MyFunctor(10);
Is same as
MyFunctor.operator()(10);
让我们深入研究并了解如何将其实际与STL结合使用。
// C++ program to demonstrate working of
// functors.
#include <bits/stdc++.h>
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<n; i++)
cout << arr[i] << " " ;
}
输出如下:
6 7 8 9 10
因此, 这里的Increment是一个函子, 一个充当函数的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);
因此, 一个物体一种被创建过载运算符()。因此, 函子可以有效地与C ++ STL结合使用。
本文作者:Supriya Srivatsa。如果你喜欢lsbin并希望做出贡献, 那么你也可以写一篇文章并将你的文章邮寄到contribution@lsbin.org。查看你的文章出现在lsbin主页上, 并帮助其他Geeks。
如果发现任何不正确的地方, 或者想分享有关上述主题的更多信息, 请发表评论。