Библиотека functional C++

В этой статье я хотел бы освятить основные цели и возможности этой библиотеки. Материал взят и переведен из http://www.cplusplus.com/reference/std/functional/

Вступление:

Функциональные объекты (функторы) созданы специально для использования, аналогично функциям. Это достигается путем определения оператора () в классе, например:
{syntaxhighlighter brush:cpp}
struct myclass {
int operator()(int a) {return a;}
} myobject;
int x = myobject (0); // function-like syntax with object myobject
{/syntaxhighlighter}

Они особенно полезны как предикаты и как функции сравнения для использования со стандартными алгоритмами. Стандартная библиотека предоставляет стандартные определения для нескольких функциональных объектов и несколько способов изменить и адаптировать поведение в заголовке .

Заголовочный файл содержит в себе:

Базовые классы:

unary_function Унарная Операция объекта базового класса (шаблон класса)
binary_function Бинарная Операция объекта базового класса (шаблон класса)

Классы-Операции:

Арифметические операции:

plus Операция сложения объектов класса (шаблон класса)
minus Операция вычитания объектов класса (шаблон класса)
multiplies Операция умножения объектов класса (шаблон класса)
divides Операция деления объектов класса (шаблон класса)
modulus Операция остатка от деления объекта (шаблон класса)
negate Операция отрицания объекта( (шаблон класса)

Операции сравнения:

equal_to Операция сравнения 2 объектов (шаблон класса)
not_equal_to Сравнение с отрицанием (шаблон класса)
greater Операция "Больше" (шаблон класса)
less Операция "Меньше" (шаблон класса)
greater_equal "Больше либо равно" (шаблон класса)
less_equal "Меньше либо равно" (шаблон класса)

Логические операции:

logical_and Логическое && (шаблон класса)
logical_or Логическое || (шаблон класса)
logical_not Логическое отрицание (шаблон класса)

Адаптеры и функции преобразования

Операции отрицания

not1 Возвращает отрицание унарного функционального объекта (шаблон функции)
not2 Возвращает отрицание бинарного функционального объекта (шаблон функции)

Функции, связывающие аргументы

bind1st Возвращает функциональный объект с первым "связанным" аргументом (шаблон функции)
bind2nd Возвращает функциональный объект со вторым "связанным" аргументом (шаблон функции)

Преобразование

ptr_fun Превращает функцию в функциональный объект (шаблон функции)
mem_fun Превращает метод в функциональный объект (версия с указателями) (шаблон функции)
mem_fun_ref Превращает метод в функциональный объект (версия с ссылками) (шаблон класса)

Производные типы

unary_negate Генерирует отрицание унарного функционального объекта (шаблон класса)
binary_negate Генерирует отрицание бинарного функционального объекта (шаблон класса)
binder1st Генерирует функциональный объект со связанным 1 аргументом (шаблон класса)
binder2nd Генерирует функциональный объект со 2 связанным аргументом (шаблон класса)
pointer_to_unary_function Генерирует унарный функциональный объект из указателя на функцию (шаблон класса)
pointer_to_binary_function Генерирует бинарный функциональный объект из указателя на функцию (шаблон класса)
mem_fun_t Генерирует функциональный объект из метода класса без аргументов (версия с указателем) (шаблон класса)
mem_fun1_t Генерирует функциональный объект из метода с одним аргументом (версия с указателем) (шаблон класса)
const_mem_fun_t Генерирует функциональный объект из константного метода класса без аргументов (версия с указателем) (шаблон класса)
const_mem_fun1_t Генерирует функциональный объект из константного метода с одним аргументом (версия с указателем) (шаблон класса)
mem_fun_ref_t Генерирует функциональный объект из метода класса без аргументов (версия с ссылкой) (шаблон класса)
mem_fun1_ref_t Генерирует функциональный объект из метода с одним аргументом (версия с ссылкой) (шаблон класса)
const_mem_fun_ref_t Генерирует функциональный объект из константного метода класса без аргументов (версия с ссылкой) (шаблон класса)
const_mem_fun1_ref_t Генерирует функциональный объект из константного метода с одним аргументом (версия с ссылкой) (шаблон класса)

Приступим к разбору всего вышенаписанного:


unary_function


unary_function - базовый класс для стандартных унарных функторов. То есть это класс, от которого будут наследоваться всевозможные унарные функторы. Он не имеет оператора "()", он просто содержит в себе 2 public поля, которые по сути своей являются typedef'ами шаблонных типов:
{syntaxhighlighter brush:cpp}
template
struct unary_function
{
typedef Arg argument_type;
typedef Result result_type;
};
{/syntaxhighlighter}

Члены
argument_type - тип аргумента, которые будет подаваться в оператор "()"
result_type - тип возвращаемого значения оператора "()"

Пример
{syntaxhighlighter brush:cpp}
#include
#include
using namespace std;

struct IsOdd : public unary_function {
bool operator() (int number) {return (number%2==1);}
};

int main () {
IsOdd IsOdd_object;
IsOdd::argument_type input;
IsOdd::result_type result;

cout << "Please enter a number: ";
cin >> input;

result = IsOdd_object (input);

cout << "Number " << input << " is " << (result?"odd":"even") << ".\n";

return 0;
}
{/syntaxhighlighter}

Вывод:
Please enter a number: 2
Number 2 is even.


binary_function


binary_function - базовый класс для бинарных функций. Так же как и unary_function, он содержит в себе только typedef'ы шаблонных типов:
{syntaxhighlighter brush:cpp}
template
struct binary_function
{
typedef Arg1 first_argument_type;
typedef Arg2 second_argument_type;
typedef Result result_type;
};
{/syntaxhighlighter}

first_argument_type, second_argument_type - типы аргументов оператора "()"
result_type - типа возвращаемоо значения оператором "()"

Пример
{syntaxhighlighter brush:cpp}
#include
#include
using namespace std;

struct Compare : public binary_function {
bool operator() (int a, int b) {return (a==b);}
};

int main () {
Compare Compare_object;
Compare::first_argument_type input1;
Compare::second_argument_type input2;
Compare::result_type result;

cout << "Please enter first number: ";
cin >> input1;
cout << "Please enter second number: ";
cin >> input2;

result = Compare_object (input1,input2);

cout << "Numbers " << input1 << " and " << input2;
if (result)
cout << " are equal.\n";
else
cout << " are not equal.\n";

return 0;
}
{/syntaxhighlighter}

Вывод:
Please enter first number: 2
Please enter second number: 33
Numbers 2 and 33 are not equal.


plus


plus - функтор, реализующий операцию сложения 2 объектов. Он наследуется от класса binary_function:
{syntaxhighlighter brush:cpp}
template struct plus : binary_function
{
T operator() (const T& x, const T& y) const
{return x+y;}
};
{/syntaxhighlighter}

Как видно, plus содержит только перегруженный оператор "()"

Пример
{syntaxhighlighter brush:cpp}
#include
#include
#include
using namespace std;

int main () {
int first[]={1,2,3,4,5};
int second[]={10,20,30,40,50};
int results[5];
transform ( first, first+5, second, results, plus() );
for (int i=0; i<5; i++)
cout << results[i] << " ";
cout << endl;
return 0;
}
{/syntaxhighlighter}
Вывод:
11 22 33 44 55