Librería de algoritmos de C++<algorithm>

En la biblioteca estándar de C++<algorithm>El archivo de encabezado proporciona un conjunto de algoritmos para operar con contenedores (como arrays, vectores, listas, etc.). Estos algoritmos incluyen ordenamiento, búsqueda, copia, comparación, etc., y son herramientas importantes para escribir código eficiente y reutilizable.

<algorithm>El archivo de encabezado define un conjunto de funciones de plantilla que pueden aplicarse a cualquier tipo de contenedor, siempre que el contenedor admita iteradores. Estos algoritmos suelen aceptar dos o más iteradores como parámetros, que representan las posiciones de inicio y fin de la operación.

Sintaxis

La mayoría de<algorithm>las funciones del encabezado siguen la siguiente sintaxis básica:

algorithm_name(container.begin(), container.end(), ...);

Aquí,containeres un objeto contenedor,begin()yend()son funciones miembro del contenedor, que devuelven iteradores que apuntan al inicio y al final del contenedor.

Ejemplo

1. Algoritmos de ordenamiento

Función: sort

Definición: Ordena los elementos de un contenedor.

Sintaxis:

sort(container.begin(), container.end(), compare_function);

Donde compare_function es una función de comparación opcional, utilizada para personalizar la forma de ordenamiento.

Ejemplo

#include <algorithm>
#include <vector>
#include <iostream>

int main() {
    std::vector<int> numbers = {5, 2, 9, 1, 5, 6};
    std::sort(numbers.begin(), numbers.end());

    for (int num : numbers) {
        std::cout << num << " ";
    }
    std::cout << std::endl;

    return 0;
}

Resultado de salida:

1 2 5 5 6 9 

std::partial_sort: Ordena un rango parcial, de modo que los primeros n elementos queden ordenados.

std::partial_sort(vec.begin(), vec.begin() + 3, vec.end());

std::stable_sort: Ordenamiento estable, conserva el orden relativo de los elementos iguales.

std::stable_sort(vec.begin(), vec.end());

2. Algoritmos de búsqueda

Función: find

Definición: Busca en el contenedor el primer elemento que coincida con el valor dado.

Sintaxis:

auto it = find(container.begin(), container.end(), value);

Si se encuentra, it apuntará al elemento coincidente; si no se encuentra, it será igual a container.end().

Ejemplo

#include <algorithm>
#include <vector>
#include <iostream>

int main() {
    std::vector<int> numbers = {1, 2, 3, 4, 5};
    auto it = std::find(numbers.begin(), numbers.end(), 3);

    if (it != numbers.end()) {
        std::cout << "Found: " << *it << std::endl;
    } else {
        std::cout << "Value not found." << std::endl;
    }

    return 0;
}

Resultado de salida:

Found: 3

std::binary_search: Realiza una búsqueda binaria en un rango ordenado.

std::sort(vec.begin(), vec.end());  // 先排序
bool found = std::binary_search(vec.begin(), vec.end(), 4);

std::find_if: Busca el primer elemento que cumpla una condición específica.

auto it = std::find_if(vec.begin(), vec.end(), [](int x) { return x > 3; });

3. Algoritmos de copia

Función: copy

Definición: Copia los elementos de un rango a otro contenedor o array.

Sintaxis:

copy(source_begin, source_end, destination_begin);

Ejemplo:

Ejemplo

#include <algorithm>
#include <vector>
#include <iostream>

int main() {
    std::vector<int> source = {1, 2, 3, 4, 5};
    int destination[5];
    std::copy(source.begin(), source.end(), destination);

    for (int i = 0; i < 5; ++i) {
        std::cout << destination[i] << " ";
    }
    std::cout << std::endl;

    return 0;
}

Resultado de salida:

1 2 3 4 5 

4. Algoritmos de comparación

Función: equal

Definición: Compara si los elementos de dos contenedores o dos rangos son iguales.

Sintaxis:

bool result = equal(first1, last1, first2);

o 

bool result = equal(first1, last1, first2, compare_function);

Ejemplo

#include <algorithm>
#include <vector>
#include <iostream>

int main() {
    std::vector<int> v1 = {1, 2, 3, 4, 5};
    std::vector<int> v2 = {1, 2, 3, 4, 5};

    bool are_equal = std::equal(v1.begin(), v1.end(), v2.begin());
    std::cout << (are_equal ? "Vectors are equal." : "Vectors are not equal.") << std::endl;

    return 0;
}

Resultado de salida:

Vectors are equal.

5. Algoritmos de modificación

std::reverse: Invierte el orden de los elementos en el rango.

std::reverse(vec.begin(), vec.end());

std::fill: Asigna un valor a todos los elementos dentro del rango especificado.

std::fill(vec.begin(), vec.end(), 0);  // 所有元素设为 0

std::replace: Reemplaza un valor en el rango por otro valor.

std::replace(vec.begin(), vec.end(), 1, 99);  // 将所有 1 替换为 99

std::copy: Copia los elementos de un rango a otro rango.

std::vector<int> vec2(6);
std::copy(vec.begin(), vec.end(), vec2.begin());

6. Algoritmos de permutación

std::next_permutation: Genera la siguiente permutación en orden lexicográfico; si no hay siguiente permutación, devuelve false.

std::vector<int> vec = {1, 2, 3};
do {
    for (int n : vec) std::cout << n << " ";
    std::cout << std::endl;
} while (std::next_permutation(vec.begin(), vec.end()));

std::prev_permutation: Genera la permutación anterior en orden lexicográfico.

std::prev_permutation(vec.begin(), vec.end());

7. Algoritmos de fusión

std::merge: Combina dos rangos ordenados en un rango ordenado.

std::vector<int> vec1 = {1, 3, 5};
std::vector<int> vec2 = {2, 4, 6};
std::vector<int> result(6);
std::merge(vec1.begin(), vec1.end(), vec2.begin(), vec2.end(), result.begin());

std::inplace_merge: Combina dos subrangos ordenados dentro de un solo rango.

std::inplace_merge(vec.begin(), middle, vec.end());

8. Algoritmos de conjuntos

std::set_union: Calcula la unión de dos conjuntos ordenados.

std::vector<int> result(10);
auto it = std::set_union(vec1.begin(), vec1.end(), vec2.begin(), vec2.end(), result.begin());
result.resize(it - result.begin());

std::set_intersection: Calcula la intersección de dos conjuntos ordenados.

auto it = std::set_intersection(vec1.begin(), vec1.end(), vec2.begin(), vec2.end(), result.begin());
result.resize(it - result.begin());

std::set_difference: Calcula la diferencia de conjuntos.

auto it = std::set_difference(vec1.begin(), vec1.end(), vec2.begin(), vec2.end(), result.begin());
result.resize(it - result.begin());

9. Otros algoritmos útiles

std::accumulate(requiere la librería <numeric>): Calcula la suma acumulativa de los elementos en el rango.

#include <numeric>
int sum = std::accumulate(vec.begin(), vec.end(), 0);

std::for_each: Ejecuta una operación sobre cada elemento en el rango.

std::for_each(vec.begin(), vec.end(), [](int& x) { x += 1; });

std::min_elementystd::max_element: Encuentra el valor mínimo y máximo dentro del rango.

auto min_it = std::min_element(vec.begin(), vec.end());
auto max_it = std::max_element(vec.begin(), vec.end());

<algorithm>Es una herramienta muy poderosa de la biblioteca estándar de C++, que proporciona una gran cantidad de algoritmos genéricos y puede simplificar enormemente la programación.

Otras extensiones