Librería estándar de C++<functional>

En la librería estándar de C++<functional>El archivo de cabecera proporciona un conjunto de plantillas de funciones que nos permiten usar objetos de función (function objects) como parámetros para pasar a algoritmos, o como valores de retorno de algoritmos. Los objetos de función son aquellos que sobrecarganoperator()de objetos, los cuales pueden ser llamados como funciones normales.

En C++, un objeto de función es una clase especial que sobrecargaoperator()para permitir que los objetos sean llamados como funciones. Esto nos permite pasar comportamientos como objetos, aumentando la flexibilidad y reutilización del código.

Sintaxis

Para usar<functional>las funcionalidades del archivo de cabecera, necesitas incluir este archivo de cabecera en tu programa de C++:

#include <functional>

Objetos de función comunes

<functional>El archivo de cabecera define algunos objetos de función comunes, incluyendo:

  • std::functionun envoltorio de función polimórfico genérico.
  • std::bindse utiliza para enlazar los parámetros de una función.
  • std::plus、std::minus、std::multiplies、std::divides、std::modulusoperaciones aritméticas básicas.
  • std::equal_to、std::not_equal_to、std::greater、std::less、std::greater_equal、std::less_equaloperaciones de comparación.
  • std::unary_negate、std::binary_negateoperación de negación lógica.
  • std::logical_and、std::logical_or、std::logical_notoperaciones lógicas.

Ejemplo

Usostd::function

std::functiones una clase de plantilla que puede almacenar, invocar y copiar cualquier objeto invocable, como funciones, expresiones lambda u objetos de función.

Ejemplo

#include <iostream>
#include <functional>

void greet() {
    std::cout << "Hello, World!" << std::endl;
}

int main() {
    std::function<void()> f = greet; // Usando una función
    f(); // Salida: Hello, World!

    std::function<void()> lambda = []() {
        std::cout << "Hello, Lambda!" << std::endl;
    };
    lambda(); // Salida: Hello, Lambda!

    return 0;
}

Usostd::bind

std::bindnos permite crear un objeto invocable que, al ser invocado, enlaza los parámetros dados a una función u objeto de función.

Ejemplo

#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; // Salida: 15

    return 0;
}

En este ejemplo,std::placeholders::_1es un marcador de posición que, al llamar abound_addserá reemplazado por el argumento real.

Uso de objetos de función de comparación

Los objetos de función de comparación se pueden usar en algoritmos, como por ejemplostd::sort。

Ejemplo

#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); // Usando una función de comparación personalizada
    for (int i : v) {
        std::cout << i << " "; // Salida: 1 3 4 5 9
    }

    std::sort(v.begin(), v.end(), std::less<int>()); // Usando el objeto de función de comparación de la biblioteca estándar
    for (int i : v) {
        std::cout << i << " "; // Salida: 1 3 4 5 9
    }

    return 0;
}

<functional>El archivo de cabecera es una parte muy poderosa de la librería estándar de C++. Proporciona una gran variedad de objetos de función y herramientas que nos permiten escribir código más flexible y reutilizable. Mediante el uso de objetos de función, podemos pasar comportamientos como parámetros o almacenarlos en contenedores, logrando así técnicas de programación más avanzadas.

Otras extensiones