C++中的函子functor详细介绍

2021年3月16日13:06:46 发表评论 1,229 次浏览

请注意标题是函子(不起作用)!!

考虑一个仅接受一个参数函数。但是, 在调用此函数时, 我们有很多信息希望传递给该函数, 但由于它仅接受一个参数, 因此我们不能。该怎么办?

一个明显的答案可能是全局变量。但是, 良好的编码习惯并不主张使用全局变量, 而是说只有在没有其他选择时才必须使用它们。

函子是可以被视为函数或函数指针的对象。在以下情况下, 函子最常与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。

如果发现任何不正确的地方, 或者想分享有关上述主题的更多信息, 请发表评论。

木子山

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: