Рубрики

Функторы в C ++

Обратите внимание, что заголовок « Функторы (не функции)» !!

Рассмотрим функцию, которая принимает только один аргумент. Однако при вызове этой функции у нас есть гораздо больше информации, которую мы хотели бы передать этой функции, но мы не можем, так как она принимает только один параметр. Что можно сделать?

Одним очевидным ответом могут быть глобальные переменные. Однако, хорошие практики кодирования не защищают использование глобальных переменных и говорят, что они должны использоваться только тогда, когда нет другой альтернативы.

Функторы — это объекты, которые можно рассматривать как указатели на функцию или функцию. Функторы чаще всего используются вместе с STL в сценарии, подобном следующему:

Ниже программа использует transform () в STL для добавления 1 ко всем элементам arr [].

// Программа на C ++ использует transform () в STL для добавления
// 1 для всех элементов 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]);

   

    // Применяем приращение ко всем элементам

    // arr [] и сохраняем измененные элементы

    // назад в arr []

    transform(arr, arr+n, arr, increment);

   

    for (int i=0; i<n; i++)

        cout << arr[i] << S" ";

   

    return 0;

}

Выход:

 2 3 4 5 6 

Этот фрагмент кода добавляет только одно значение к содержимому arr []. Теперь предположим, что мы хотим добавить 5 к содержимому arr [].

Видишь что происходит? Поскольку для преобразования требуется унарная функция (функция, принимающая только один аргумент) для массива, мы не можем передать число в increment (). И это, по сути, заставит нас написать несколько разных функций для добавления каждого номера. Какой беспорядок Здесь функторы вступают в действие.

Функтор (или объект функции) — это класс C ++, который действует как функция. Функторы вызываются с использованием того же старого синтаксиса вызова функций. Чтобы создать функтор, мы создаем объект, который перегружает operator () .

The line,
MyFunctor(10);

Is same as
MyFunctor.operator()(10);

Давайте углубимся в глубину и поймем, как это можно использовать в сочетании с STL.

// C ++ программа для демонстрации работы
// функторы.
#include <bits/stdc++.h>

using namespace std;

  
// Функтор

class increment

{

private:

    int num;

public:

    increment(int n) : num(n) {  }

  

    // Эта перегрузка оператора позволяет вызывать

    // операторная функция () для объектов приращения

    int operator () (int arr_num) const {

        return num + arr_num;

    }

};

  
// Код драйвера

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); 

Таким образом, создается объект a, который перегружает operator () . Следовательно, функторы могут эффективно использоваться вместе с C ++ STL.

Эта статья предоставлена Суприей Шриватса . Если вам нравится GeeksforGeeks и вы хотите внести свой вклад, вы также можете написать статью и отправить ее по почте на contrib@geeksforgeeks.org. Смотрите свою статью, появляющуюся на главной странице GeeksforGeeks, и помогите другим вундеркиндам.

Пожалуйста, напишите комментарии, если вы обнаружите что-то неправильное, или вы хотите поделиться дополнительной информацией по обсуждаемой теме

Рекомендуемые посты:

Функторы в C ++

0.00 (0%) 0 votes