Объекты функции в стандартной библиотеке C++
Объект функции(или функтор) — это любой тип, реализующий operator(). Этот оператор называется оператором вызова или иногда оператором приложения. Стандартная библиотека C++ использует объекты функций главным образом в качестве критериев сортировки для контейнеров и в алгоритмах.
Объекты функций обеспечивают два основных преимущества по сравнению с прямым вызовом функций. Во-первых, объект функции может содержать состояние. Во-вторых, объект функции является типом и поэтому может использоваться в качестве параметра шаблона.
Создание объекта функции
Чтобы создать объект функции, создайте тип и реализуйте operator(), например:
class Functor
{
public:
int operator()(int a, int b)
{
return a < b;
}
};
int main()
{
Functor f;
int a = 5;
int b = 7;
int ans = f(a, b);
}
Последняя строка функции main
демонстрирует способ вызов объекта функции. Этот вызов выглядит как вызов функции, но фактически вызывает оператор() типа Functor. Сходство между вызовом объекта функции и вызовом функции заключается в том, как появляется термин "объект функции".
Объекты функций и контейнеры
Стандартная библиотека C++ содержит несколько объектов функций в файле заголовка <functional>
. Один из этих объектов функций применяется как критерий сортировки для контейнеров. Например, контейнер set
объявляется следующим образом:
template <class Key,
class Traits=less<Key>,
class Allocator=allocator<Key>>
class set
Второй аргумент шаблона — объект функции less
. Этот объект функции возвращает true
, если первый параметр меньше второго параметра. Так как некоторые контейнеры сортируют их элементы, контейнеру требуется способ сравнения двух элементов. Сравнение выполняется с помощью объекта функции. Можно определить собственные критерии сортировки для контейнеров, создав объект функции и указав его в списке шаблонов для контейнера.
Объекты функций и алгоритмы
Объекты функций также используются в алгоритмах. Например, алгоритм remove_if
объявляется следующим образом:
template <class ForwardIterator, class Predicate>
ForwardIterator remove_if(
ForwardIterator first,
ForwardIterator last,
Predicate pred);
Последний аргумент remove_if
является объектом функции, который возвращает логическое значение ( предикат). Если результат выполнения объекта функции — значение true
, элемент удаляется из контейнера, доступ к которому получают итераторы first
и last
. Вы можете использовать любой из объектов функции, объявленных в заголовке <functional>
аргумента pred
, или создать собственные объекты.
См. также
Обратная связь
https://aka.ms/ContentUserFeedback.
Ожидается в ближайшее время: в течение 2024 года мы постепенно откажемся от GitHub Issues как механизма обратной связи для контента и заменим его новой системой обратной связи. Дополнительные сведения см. в разделеОтправить и просмотреть отзыв по