Namespaces
Variants

Biblioteca de algoritmos

De es.cppreference.net
< cpp
 
 
Biblioteca de algoritmos
Algoritmos restringidos y algoritmos sobre rangos (C++20)
Algoritmos restringidos, p.ej. ranges::copy, ranges::sort, ...
Operaciones de secuencia no modificadoras    
Operaciones por lotes
(C++17)
Operaciones de búsqueda
Operaciones de secuencia modificadoras
Operaciones de copia
(C++11)
(C++11)
Operaciones de intercambio
Operaciones de transformación
Operaciones de generación
Operaciones de eliminación
Operaciones de cambio de orden
(hasta C++17)(C++11)
(C++20)(C++20)
Operaciones de muestreo
(C++17)

Operaciones de ordenamiento y relacionadas
Operaciones de particionamiento
(C++11)    

Operaciones de ordenamiento
Operaciones de búsqueda binaria
(en rangos particionados)
Operaciones de conjunto (en rangos ordenados)
Operaciones de fusión (en rangos ordenados)
Operaciones de montículo
Operaciones de mínimo/máximo
(C++11)
(C++17)
Operaciones de comparación lexicográfica
Operaciones de permutación


 

La biblioteca de algoritmos define funciones para una variedad de propósitos (p.ej. búsqueda, ordenamiento, conteo, manipulación) que operan sobre rangos de elementos.

Algoritmos restringidos (desde C++20)

C++20 proporciona restringidas versiones de la mayoría de los algoritmos en el espacio de nombres std::ranges. En estos algoritmos, un rango puede especificarse como un iterador-centinela par o como un solo rango argumento, y se admiten proyecciones y llamables a puntero a miembro. Adicionalmente, los tipos de retorno de la mayoría de los algoritmos han sido cambiados para devolver toda la información potencialmente útil calculada durante la ejecución del algoritmo.

std::vector<int> v{7, 1, 4, 0, -1};
std::ranges::sort(v); // constrained algorithm

Algoritmos paralelos (desde C++17)

Un algoritmo paralelo es una plantilla de función en la biblioteca de algoritmos con un parámetro de plantilla denominado ExecutionPolicy o restringido por execution-policy (desde C++26). Tal parámetro de plantilla se denomina un parámetro de plantilla de política de ejecución , y describe la forma en que se puede paralelizar la ejecución de un algoritmo paralelo.

A menos que se indique lo contrario, los algoritmos paralelos pueden hacer copias arbitrarias de elementos de rangos, siempre que tanto std::is_trivially_copy_constructible_v<T> como std::is_trivially_destructible_v<T> sean true, donde T es el tipo de elementos.

Políticas de ejecución

Los algoritmos de la biblioteca estándar admiten varias políticas de ejecución, y la biblioteca proporciona los tipos y objetos de política de ejecución correspondientes. Los usuarios pueden seleccionar una política de ejecución estáticamente invocando un algoritmo paralelo con un objeto de política de ejecución del tipo correspondiente.

Las implementaciones de la biblioteca estándar (pero no los usuarios) pueden definir políticas de ejecución adicionales como una extensión. La semántica de los algoritmos paralelos invocados con un objeto de política de ejecución de tipo definido por la implementación está definida por la implementación.

Definido en el encabezado <execution>
Definido en el espacio de nombres std::execution
tipos de política de ejecución
(clase)
(C++17)(C++17)(C++17)(C++20)
objetos de política de ejecución global
(constante)
Definido en el espacio de nombres std
verifica si una clase representa una política de ejecución
(plantilla de clase)
especifica que un tipo representa una política de ejecución
(concepto solo de exposición*)

Operaciones de secuencia no modificadoras

Operaciones por lotes

Definido en el encabezado <algorithm>
aplica un unario objeto función a los elementos de un rango
(plantilla de función & objeto función de algoritmo)
aplica un objeto función a los primeros N elementos de una secuencia
(plantilla de función & objeto función de algoritmo)

Operaciones de búsqueda

Definido en el encabezado <algorithm>
(C++11)(C++11)(C++11)
comprueba si un predicado es true para todos, alguno o ninguno de los elementos de un rango
(plantilla de función & objeto función de algoritmo)
comprueba si el rango contiene el elemento o subrango dado
(objeto función de algoritmo)
encuentra el primer elemento que satisface criterios específicos
(plantilla de función & objeto función de algoritmo)
encuentra el último elemento que satisface criterios específicos
(objeto función de algoritmo)
encuentra la última secuencia de elementos en un rango determinado
(plantilla de función & objeto función de algoritmo)
busca cualquiera de un conjunto de elementos
(plantilla de función & objeto función de algoritmo)
encuentra los primeros dos elementos adyacentes que son iguales (o satisfacen un predicado dado)
(plantilla de función & objeto función de algoritmo)
devuelve el número de elementos que satisfacen criterios específicos
(plantilla de función & objeto función de algoritmo)
encuentra la primera posición donde dos rangos difieren
(plantilla de función & objeto función de algoritmo)
determina si dos conjuntos de elementos son iguales
(plantilla de función & objeto función de algoritmo)
busca la primera aparición de un rango de elementos
(plantilla de función & objeto función de algoritmo)
busca la primera aparición de un número de copias consecutivas de un elemento en un rango
(plantilla de función & objeto función de algoritmo)
comprueba si un rango comienza con otro rango
(objeto función de algoritmo)
comprueba si un rango termina con otro rango
(objeto función de algoritmo)

Operaciones de plegado (desde C++23)

Definido en el encabezado <algorithm>
pliega hacia la izquierda un rango de elementos
(objeto función de algoritmo)
pliega hacia la izquierda un rango de elementos usando el primer elemento como valor inicial
(objeto función de algoritmo)
pliega hacia la derecha un rango de elementos
(objeto función de algoritmo)
pliega hacia la derecha un rango de elementos usando el último elemento como valor inicial
(objeto función de algoritmo)
pliega hacia la izquierda un rango de elementos, y retorna un pair (iterador, valor)
(objeto función de algoritmo)
pliega hacia la izquierda un rango de elementos usando el primer elemento como valor inicial, y retorna un pair (iterador, optional )
(objeto función de algoritmo)

Operaciones de modificación de secuencias

Operaciones de copia

Definido en el encabezado <algorithm>
copia un rango de elementos a una nueva ubicación
(plantilla de función & objeto función de algoritmo)
(C++11)
copia un número de elementos a una nueva ubicación
(plantilla de función & objeto función de algoritmo)
copia un rango de elementos en orden inverso
(plantilla de función & objeto función de algoritmo)
(C++11)
mueve un rango de elementos a una nueva ubicación
(plantilla de función & objeto función de algoritmo)
mueve un rango de elementos a una nueva ubicación en orden inverso
(plantilla de función & objeto función de algoritmo)

Operaciones de intercambio

Definido en la cabecera <algorithm>      (hasta C++11)
Definido en la cabecera <utility>          (desde C++11)
Definido en la cabecera <string_view>
intercambia los valores de dos objetos
(plantilla de función)
Definido en la cabecera <algorithm>
intercambia dos rangos de elementos
(plantilla de función & objeto función de algoritmo)
intercambia los elementos apuntados por dos iteradores
(plantilla de función)

Operaciones de transformación

Definido en el encabezado <algorithm>
aplica una función a un rango de elementos, almacenando los resultados en un rango de destino
(plantilla de función & objeto función de algoritmo)
reemplaza todos los valores que satisfacen criterios específicos con otro valor
(plantilla de función & objeto función de algoritmo)
copia un rango, reemplazando elementos que satisfacen criterios específicos con otro valor
(plantilla de función & objeto función de algoritmo)

Operaciones de generación

Definido en el encabezado<algorithm>
asigna mediante copia el valor dado a cada elemento en un rango
(plantilla de función & objeto función de algoritmo)
asigna mediante copia el valor dado a N elementos en un rango
(plantilla de función & objeto función de algoritmo)
asigna los resultados de llamadas sucesivas a funciones a cada elemento en un rango
(plantilla de función & objeto función de algoritmo)
asigna los resultados de llamadas sucesivas a funciones a N elementos en un rango
(plantilla de función & objeto función de algoritmo)

Operaciones de eliminación

Definido en el encabezado <algorithm>
elimina elementos que cumplen criterios específicos
(plantilla de función & objeto de función de algoritmo)
copia un rango de elementos omitiendo aquellos que cumplen criterios específicos
(plantilla de función & objeto de función de algoritmo)
elimina elementos duplicados consecutivos en un rango
(plantilla de función & objeto de función de algoritmo)
crea una copia de un rango de elementos que no contiene duplicados consecutivos
(plantilla de función & objeto de función de algoritmo)

Operaciones que cambian el orden

Definido en el encabezado <algorithm>
invierte el orden de los elementos en un rango
(plantilla de función & objeto función de algoritmo)
crea una copia de un rango en orden inverso
(plantilla de función & objeto función de algoritmo)
rota el orden de los elementos en un rango
(plantilla de función & objeto función de algoritmo)
copia y rota un rango de elementos
(plantilla de función & objeto función de algoritmo)
desplaza elementos en un rango
(plantilla de función & objeto función de algoritmo)
(hasta C++17)(C++11)
reordena aleatoriamente los elementos en un rango
(plantilla de función & objeto función de algoritmo)

Operaciones de muestreo

Definido en el encabezado <algorithm>
(C++17)
selecciona N elementos aleatorios de una secuencia
(plantilla de función & objeto función de algoritmo)

Ordenación y operaciones relacionadas

Requisitos

Algunos algoritmos requieren que la secuencia representada por los argumentos esté “ordenada” o “particionada”. El comportamiento no está definido si no se cumple el requisito.

Una secuencia está ordenada con respecto a un comparador comp si para todo iterador iter que apunta a la secuencia y todo entero no negativo n tal que iter + n[1] es un iterador válido que apunta a un elemento de la secuencia, comp(*(iter + n), *iter) == false[1].

(hasta C++20)

Una secuencia está ordenada con respecto a comp y proj para un comparador comp y una proyección proj si para todo iterador iter que apunta a la secuencia y todo entero no negativo n tal que iter + n[1] es un iterador válido que apunta a un elemento de la secuencia, bool(std::invoke(comp, std::invoke(proj, *(iter + n)),
                       std::invoke(proj, *iter)))
[1] es false.

Una secuencia está ordenada con respecto a un comparador comp si la secuencia está ordenada con respecto a comp y std::identity{} (la proyección identidad).

(desde C++20)

Una secuencia [startfinish) está particionada con respecto a una expresión f(e) si existe un entero n tal que para todo i en [0std::distance(start, finish)), f(*(start + i))[1] es true si y solo si i < n.

  1. 1.0 1.1 1.2 1.3 1.4 iter + n simplemente significa “el resultado de incrementar iter n veces”, independientemente de si iter es un iterador de acceso aleatorio.

Operaciones de particionamiento

Definido en el encabezado <algorithm>
determina si el rango está particionado por el predicado dado
(plantilla de función & objeto función de algoritmo)
divide un rango de elementos en dos grupos
(plantilla de función & objeto función de algoritmo)
copia un rango dividiendo los elementos en dos grupos
(plantilla de función & objeto función de algoritmo)
divide los elementos en dos grupos mientras preserva su orden relativo dentro de cada grupo
(plantilla de función & objeto función de algoritmo)
localiza el punto de partición de un rango particionado
(plantilla de función & objeto función de algoritmo)

Operaciones de ordenamiento

Definido en el encabezado <algorithm>
ordena un rango de elementos
(plantilla de función & objeto función de algoritmo)
ordena un rango de elementos preservando el orden relativo entre elementos equivalentes
(plantilla de función & objeto función de algoritmo)
ordena los primeros N elementos de un rango
(plantilla de función & objeto función de algoritmo)
copia y ordena parcialmente un rango de elementos
(plantilla de función & objeto función de algoritmo)
(C++11)
comprueba si un rango está ordenado
(plantilla de función & objeto función de algoritmo)
encuentra el subrango ordenado más grande
(plantilla de función & objeto función de algoritmo)
encuentra el N-ésimo elemento como si el rango estuviera ordenado
(plantilla de función & objeto función de algoritmo)

Operaciones de búsqueda binaria (en rangos particionados)

Definido en el encabezado <algorithm>
encuentra el primer elemento no menor que el valor dado usando búsqueda binaria
(plantilla de función & objeto de función de algoritmo)
encuentra el primer elemento mayor que el valor dado usando búsqueda binaria
(plantilla de función & objeto de función de algoritmo)
encuentra el rango de elementos que coinciden con el valor dado usando búsqueda binaria
(plantilla de función & objeto de función de algoritmo)
determina si un elemento existe en un rango usando búsqueda binaria
(plantilla de función & objeto de función de algoritmo)

Operaciones de conjuntos (en rangos ordenados)

Definido en el encabezado <algorithm>
determina si una secuencia es una subsecuencia de otra
(plantilla de función & objeto de función de algoritmo)
computa la unión de dos conjuntos
(plantilla de función & objeto de función de algoritmo)
computa la intersección de dos conjuntos
(plantilla de función & objeto de función de algoritmo)
computa la diferencia entre dos conjuntos
(plantilla de función & objeto de función de algoritmo)
computa la diferencia simétrica entre dos conjuntos
(plantilla de función & objeto de función de algoritmo)

Operaciones de fusión (en rangos ordenados)

Definido en el encabezado <algorithm>
fusiona dos rangos ordenados
(plantilla de función & objeto función de algoritmo)
fusiona dos rangos ordenados en el lugar
(plantilla de función & objeto función de algoritmo)

Operaciones de montículo

Un rango de acceso aleatorio rango [firstlast) es un montículo con respecto a un comparador comp si bool(comp(first[(i - 1) / 2], first[i])) es false para todo entero i en (0last - first).

(hasta C++20)

Un rango de acceso aleatorio rango [firstlast) es un montículo con respecto a comp y proj para un comparador comp y una proyección proj si bool(std::invoke(comp, std::invoke(proj, first[(i - 1) / 2]),
                       std::invoke(proj, first[i]))
es false para todo entero i en (0last - first).

Un rango de acceso aleatorio [firstlast) es un montículo con respecto a un comparador comp si el rango es un montículo con respecto a comp y std::identity{} (la proyección de identidad).

(desde C++20)

Un montículo puede crearse mediante std::make_heap y ranges::make_heap(desde C++20).

Para más propiedades del montículo, véase montículo máximo.


Definido en el encabezado <algorithm>
añade un elemento a un montículo máximo
(plantilla de función & objeto función de algoritmo)
elimina el elemento más grande de un montículo máximo
(plantilla de función & objeto función de algoritmo)
crea un montículo máximo a partir de un rango de elementos
(plantilla de función & objeto función de algoritmo)
convierte un montículo máximo en un rango de elementos ordenados en orden ascendente
(plantilla de función & objeto función de algoritmo)
(C++11)
comprueba si el rango dado es un montículo máximo
(plantilla de función & objeto función de algoritmo)
encuentra el subrango más grande que es un montículo máximo
(plantilla de función & objeto función de algoritmo)

Operaciones de mínimo/máximo

Definido en el encabezado <algorithm>
devuelve el mayor de los valores dados
(plantilla de función & objeto función de algoritmo)
devuelve el elemento más grande en un rango
(plantilla de función & objeto función de algoritmo)
devuelve el menor de los valores dados
(plantilla de función & objeto función de algoritmo)
devuelve el elemento más pequeño en un rango
(plantilla de función & objeto función de algoritmo)
(C++11)
devuelve el menor y el mayor de dos elementos
(plantilla de función & objeto función de algoritmo)
devuelve los elementos más pequeño y más grande en un rango
(plantilla de función & objeto función de algoritmo)
(C++17)
fija un valor entre un par de valores límite
(plantilla de función & objeto función de algoritmo)

Operaciones de comparación lexicográfica

Definido en el encabezado <algorithm>
compara dos rangos lexicográficamente
(plantilla de función & objeto de función de algoritmo)
compara dos rangos utilizando comparación de tres vías
(plantilla de función)

Operaciones de permutación

Definido en el encabezado <algorithm>
genera la siguiente permutación lexicográfica mayor de un rango de elementos
(plantilla de función & objeto función de algoritmo)
genera la siguiente permutación lexicográfica menor de un rango de elementos
(plantilla de función & objeto función de algoritmo)
determina si una secuencia es una permutación de otra secuencia
(plantilla de función & objeto función de algoritmo)

Operaciones numéricas

Definido en el encabezado <numeric>
(C++11)
rellena un rango con incrementos sucesivos del valor inicial
(plantilla de función & objeto función de algoritmo)
suma o pliega un rango de elementos
(plantilla de función)
calcula el producto interno de dos rangos de elementos
(plantilla de función)
calcula las diferencias entre elementos adyacentes en un rango
(plantilla de función)
calcula la suma parcial de un rango de elementos
(plantilla de función)
(C++17)
similar a std::accumulate, excepto fuera de orden
(plantilla de función)
similar a std::partial_sum, excluye el iésimo elemento de entrada de la iésima suma
(plantilla de función)
similar a std::partial_sum, incluye el iésimo elemento de entrada en la iésima suma
(plantilla de función)
aplica un invocable, luego reduce fuera de orden
(plantilla de función)
aplica un invocable, luego calcula el barrido exclusivo
(plantilla de función)
aplica un invocable, luego calcula el barrido inclusivo
(plantilla de función)

Especializados <memory> algoritmos

Especializados <random> algoritmos (desde C++26)

Definido en el encabezado <random>
rellena un rango con números aleatorios de un generador uniforme de bits aleatorios
(objeto de función de algoritmo)

Notas

Macro de prueba de características Valor Std Característica
__cpp_lib_algorithm_iterator_requirements 202207L (C++23) Iteradores de rangos como entradas a algoritmos no-Ranges
__cpp_lib_clamp 201603L (C++17) std::clamp
__cpp_lib_constexpr_algorithms 201806L (C++20) Constexpr para algoritmos
202306L (C++26) Ordenación estable constexpr
__cpp_lib_algorithm_default_value_type 202403L (C++26) Inicialización de lista para algoritmos
__cpp_lib_freestanding_algorithm 202311L (C++26) Facilidades independientes en <algorithm>
__cpp_lib_robust_nonmodifying_seq_ops 201304L (C++14) Hacer operaciones de secuencia no modificadoras más robustas (sobrecargas de dos rangos para std::mismatch , std::equal y std::is_permutation)
__cpp_lib_sample 201603L (C++17) std::sample
__cpp_lib_shift 201806L (C++20) std::shift_left y std::shift_right

Biblioteca C

Definido en el encabezado <cstdlib>
ordena un rango de elementos con tipo no especificado
(función)
busca un elemento de tipo no especificado en un array
(función)

Informes de defectos

Los siguientes informes de defectos que modifican el comportamiento se aplicaron retroactivamente a los estándares publicados anteriormente de C++.

DR Aplicado a Comportamiento publicado Comportamiento correcto
LWG 193 C++98 el heap requería que * first fuera el elemento más grande puede haber elementos
iguales a * first
LWG 2150 C++98 la definición de secuencia ordenada era incorrecta corregida
LWG 2166 C++98 el requisito de heap no coincidía lo suficiente
con la definición de max heap
requisito mejorado

Véase también

Documentación de C para Algoritmos