📜  C++中的函子

📅  最后修改于: 2021-05-25 21:29:28             🧑  作者: Mango

请注意标题是函子(不是函数)!

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

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

函子是可以被视为函数或函数指针的对象。在以下情况下,函子最常与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等的更多准备工作,请参阅“完整面试准备课程”