Стандартная библиотека C++<functional>
В стандартной библиотеке C++<functional>Заголовочный файл предоставляет набор шаблонов функций, которые позволяют нам использовать функциональные объекты в качестве параметров алгоритмов или в качестве возвращаемых значений алгоритмов. Функциональные объекты — это те, которые перегружаютoperator()объекты, которые можно вызывать как обычные функции.
В C++ функциональный объект — это специальный класс, который перегружаетoperator()чтобы объекты можно было вызывать как функции. Это позволяет передавать поведение в виде объектов, повышая гибкость и возможность повторного использования кода.
Синтаксис
Чтобы использовать<functional>Для функциональности из заголовочного файла необходимо включить этот заголовочный файл в вашу программу на C++:
#include <functional>
Общие функциональные объекты
<functional>Заголовочный файл определяет некоторые часто используемые функциональные объекты, включая:
std::function: универсальная полиморфная обёртка функции.std::bind: используется для привязки аргументов к функциям.std::plus、std::minus、std::multiplies、std::divides、std::modulus: базовые арифметические операции.std::equal_to、std::not_equal_to、std::greater、std::less、std::greater_equal、std::less_equal: операции сравнения.std::unary_negate、std::binary_negate: операция логического отрицания.std::logical_and、std::logical_or、std::logical_not: логические операции.
Пример
Использованиеstd::function
std::function— это шаблонный класс, который может хранить, вызывать и копировать любой вызываемый объект, такой как функции, лямбда-выражения или функциональные объекты.
Пример
#include <functional>
void greet() {
std::cout << "Hello, World!" << std::endl;
}
int main() {
std::function<void()> f = greet; // Использование функции
f(); // Вывод: Hello, World!
std::function<void()> lambda = []() {
std::cout << "Hello, Lambda!" << std::endl;
};
lambda(); // Вывод: Hello, Lambda!
return 0;
}
Использованиеstd::bind
std::bindПозволяет нам создать вызываемый объект, который при вызове привязывает заданные аргументы к функции или функциональному объекту.
Пример
#include <functional>
int add(int a, int b) {
return a + b;
}
int main() {
auto bound_add = std::bind(add, 5, std::placeholders::_1);
std::cout << bound_add(10) << std::endl; // Вывод: 15
return 0;
}
В этом примере,std::placeholders::_1является плейсхолдером, который при вызовеbound_add, будет заменён фактическими аргументами.
использование объектов функций сравнения
Объекты функций сравнения можно использовать в алгоритмах, таких какstd::sort。
Пример
#include <vector>
#include <algorithm>
#include <functional>
bool compare(int a, int b) {
return a < b;
}
int main() {
std::vector<int> v = {5, 3, 9, 1, 4};
std::sort(v.begin(), v.end(), compare); // Использование пользовательской функции сравнения
for (int i : v) {
std::cout << i << " "; // Вывод: 1 3 4 5 9
}
std::sort(v.begin(), v.end(), std::less<int>()); // Использование объектов функций сравнения стандартной библиотеки
for (int i : v) {
std::cout << i << " "; // Вывод: 1 3 4 5 9
}
return 0;
}
<functional>Заголовочный файл — очень мощная часть стандартной библиотеки C++. Он предоставляет богатый набор объектов функций и утилит, позволяя нам писать более гибкий и переиспользуемый код. Используя объекты функций, мы можем передавать поведение как параметры или хранить их в контейнерах, тем самым достигая более продвинутых приёмов программирования.