Стандартная библиотека 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 <iostream>
#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 <iostream>
#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 <iostream>
#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++. Он предоставляет богатый набор объектов функций и утилит, позволяя нам писать более гибкий и переиспользуемый код. Используя объекты функций, мы можем передавать поведение как параметры или хранить их в контейнерах, тем самым достигая более продвинутых приёмов программирования.

Другие расширения