Biblioteca de algoritmos
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 | |
(C++17)(C++17)(C++17)(C++20) |
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 | |
(C++17) |
verifica si una clase representa una política de ejecución (plantilla de clase) |
(C++26) |
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) | |
(C++20) |
|
(C++17) |
aplica un objeto función a los primeros N elementos de una secuencia (plantilla de función & objeto función de algoritmo) |
(C++20) |
|
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) |
(C++20)(C++20)(C++20) |
|
(C++23)(C++23) |
comprueba si el rango contiene el elemento o subrango dado (objeto función de algoritmo) |
(C++11) |
encuentra el primer elemento que satisface criterios específicos (plantilla de función & objeto función de algoritmo) |
(C++20)(C++20)(C++20) |
|
(C++23)(C++23)(C++23) |
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) | |
(C++20) |
|
| busca cualquiera de un conjunto de elementos (plantilla de función & objeto función de algoritmo) | |
(C++20) |
|
| encuentra los primeros dos elementos adyacentes que son iguales (o satisfacen un predicado dado) (plantilla de función & objeto función de algoritmo) | |
(C++20) |
|
| devuelve el número de elementos que satisfacen criterios específicos (plantilla de función & objeto función de algoritmo) | |
(C++20)(C++20) |
|
| encuentra la primera posición donde dos rangos difieren (plantilla de función & objeto función de algoritmo) | |
(C++20) |
|
| determina si dos conjuntos de elementos son iguales (plantilla de función & objeto función de algoritmo) | |
(C++20) |
|
| busca la primera aparición de un rango de elementos (plantilla de función & objeto función de algoritmo) | |
(C++20) |
|
| 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) | |
(C++20) |
|
(C++23) |
comprueba si un rango comienza con otro rango (objeto función de algoritmo) |
(C++23) |
comprueba si un rango termina con otro rango (objeto función de algoritmo) |
Operaciones de plegado (desde C++23)
|
Definido en el encabezado
<algorithm>
|
|
|
(C++23)
|
pliega hacia la izquierda un rango de elementos
(objeto función de algoritmo) |
|
(C++23)
|
pliega hacia la izquierda un rango de elementos usando el primer elemento como valor inicial
(objeto función de algoritmo) |
|
(C++23)
|
pliega hacia la derecha un rango de elementos
(objeto función de algoritmo) |
|
(C++23)
|
pliega hacia la derecha un rango de elementos usando el último elemento como valor inicial
(objeto función de algoritmo) |
|
(C++23)
|
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> | |
(C++11) |
copia un rango de elementos a una nueva ubicación (plantilla de función & objeto función de algoritmo) |
(C++20)(C++20) |
|
(C++11) |
copia un número de elementos a una nueva ubicación (plantilla de función & objeto función de algoritmo) |
(C++20) |
|
| copia un rango de elementos en orden inverso (plantilla de función & objeto función de algoritmo) | |
(C++20) |
|
(C++11) |
mueve un rango de elementos a una nueva ubicación (plantilla de función & objeto función de algoritmo) |
(C++20) |
|
(C++11) |
mueve un rango de elementos a una nueva ubicación en orden inverso (plantilla de función & objeto función de algoritmo) |
(C++20) |
|
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) | |
(C++20) |
|
| 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) | |
(C++20) |
|
| reemplaza todos los valores que satisfacen criterios específicos con otro valor (plantilla de función & objeto función de algoritmo) | |
(C++20)(C++20) |
|
| copia un rango, reemplazando elementos que satisfacen criterios específicos con otro valor (plantilla de función & objeto función de algoritmo) | |
(C++20)(C++20) |
|
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) | |
(C++20) |
|
| asigna mediante copia el valor dado a N elementos en un rango (plantilla de función & objeto función de algoritmo) | |
(C++20) |
|
| asigna los resultados de llamadas sucesivas a funciones a cada elemento en un rango (plantilla de función & objeto función de algoritmo) | |
(C++20) |
|
| asigna los resultados de llamadas sucesivas a funciones a N elementos en un rango (plantilla de función & objeto función de algoritmo) | |
(C++20) |
|
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) | |
(C++20)(C++20) |
|
| copia un rango de elementos omitiendo aquellos que cumplen criterios específicos (plantilla de función & objeto de función de algoritmo) | |
(C++20)(C++20) |
|
| elimina elementos duplicados consecutivos en un rango (plantilla de función & objeto de función de algoritmo) | |
(C++20) |
|
| crea una copia de un rango de elementos que no contiene duplicados consecutivos (plantilla de función & objeto de función de algoritmo) | |
(C++20) |
|
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) | |
(C++20) |
|
| crea una copia de un rango en orden inverso (plantilla de función & objeto función de algoritmo) | |
(C++20) |
|
| rota el orden de los elementos en un rango (plantilla de función & objeto función de algoritmo) | |
(C++20) |
|
| copia y rota un rango de elementos (plantilla de función & objeto función de algoritmo) | |
(C++20) |
|
(C++20)(C++20) |
desplaza elementos en un rango (plantilla de función & objeto función de algoritmo) |
(C++23)(C++23) |
|
(hasta C++17)(C++11) |
reordena aleatoriamente los elementos en un rango (plantilla de función & objeto función de algoritmo) |
(C++20) |
|
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) |
(C++20) |
|
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 |
(hasta C++20) |
|
Una secuencia está ordenada con respecto a Una secuencia está ordenada con respecto a un comparador |
(desde C++20) |
Una secuencia [start, finish) está particionada con respecto a una expresión f(e) si existe un entero n tal que para todo i en [0, std::distance(start, finish)), f(*(start + i))[1] es true si y solo si i < n.
Operaciones de particionamiento
Definido en el encabezado
<algorithm> | |
(C++11) |
determina si el rango está particionado por el predicado dado (plantilla de función & objeto función de algoritmo) |
(C++20) |
|
| divide un rango de elementos en dos grupos (plantilla de función & objeto función de algoritmo) | |
(C++20) |
|
(C++11) |
copia un rango dividiendo los elementos en dos grupos (plantilla de función & objeto función de algoritmo) |
(C++20) |
|
| divide los elementos en dos grupos mientras preserva su orden relativo dentro de cada grupo (plantilla de función & objeto función de algoritmo) | |
(C++20) |
|
(C++11) |
localiza el punto de partición de un rango particionado (plantilla de función & objeto función de algoritmo) |
(C++20) |
|
Operaciones de ordenamiento
Definido en el encabezado
<algorithm> | |
| ordena un rango de elementos (plantilla de función & objeto función de algoritmo) | |
(C++20) |
|
| ordena un rango de elementos preservando el orden relativo entre elementos equivalentes (plantilla de función & objeto función de algoritmo) | |
(C++20) |
|
| ordena los primeros N elementos de un rango (plantilla de función & objeto función de algoritmo) | |
(C++20) |
|
| copia y ordena parcialmente un rango de elementos (plantilla de función & objeto función de algoritmo) | |
(C++20) |
|
(C++11) |
comprueba si un rango está ordenado (plantilla de función & objeto función de algoritmo) |
(C++20) |
|
(C++11) |
encuentra el subrango ordenado más grande (plantilla de función & objeto función de algoritmo) |
(C++20) |
|
| encuentra el N-ésimo elemento como si el rango estuviera ordenado (plantilla de función & objeto función de algoritmo) | |
(C++20) |
|
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) | |
(C++20) |
|
| encuentra el primer elemento mayor que el valor dado usando búsqueda binaria (plantilla de función & objeto de función de algoritmo) | |
(C++20) |
|
| 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) | |
(C++20) |
|
| determina si un elemento existe en un rango usando búsqueda binaria (plantilla de función & objeto de función de algoritmo) | |
(C++20) |
|
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) | |
(C++20) |
|
| computa la unión de dos conjuntos (plantilla de función & objeto de función de algoritmo) | |
(C++20) |
|
| computa la intersección de dos conjuntos (plantilla de función & objeto de función de algoritmo) | |
(C++20) |
|
| computa la diferencia entre dos conjuntos (plantilla de función & objeto de función de algoritmo) | |
(C++20) |
|
| 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) | |
(C++20) |
|
| fusiona dos rangos ordenados en el lugar (plantilla de función & objeto función de algoritmo) | |
(C++20) |
|
Operaciones de montículo
|
Un rango de acceso aleatorio rango |
(hasta C++20) |
|
Un rango de acceso aleatorio rango Un rango de acceso aleatorio |
(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) | |
(C++20) |
|
| elimina el elemento más grande de un montículo máximo (plantilla de función & objeto función de algoritmo) | |
(C++20) |
|
| crea un montículo máximo a partir de un rango de elementos (plantilla de función & objeto función de algoritmo) | |
(C++20) |
|
| 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++20) |
|
(C++11) |
comprueba si el rango dado es un montículo máximo (plantilla de función & objeto función de algoritmo) |
(C++20) |
|
(C++11) |
encuentra el subrango más grande que es un montículo máximo (plantilla de función & objeto función de algoritmo) |
(C++20) |
|
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) | |
(C++20) |
|
| devuelve el elemento más grande en un rango (plantilla de función & objeto función de algoritmo) | |
(C++20) |
|
| devuelve el menor de los valores dados (plantilla de función & objeto función de algoritmo) | |
(C++20) |
|
| devuelve el elemento más pequeño en un rango (plantilla de función & objeto función de algoritmo) | |
(C++20) |
|
(C++11) |
devuelve el menor y el mayor de dos elementos (plantilla de función & objeto función de algoritmo) |
(C++20) |
|
(C++11) |
devuelve los elementos más pequeño y más grande en un rango (plantilla de función & objeto función de algoritmo) |
(C++20) |
|
(C++17) |
fija un valor entre un par de valores límite (plantilla de función & objeto función de algoritmo) |
(C++20) |
|
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) | |
(C++20) |
|
| genera la siguiente permutación lexicográfica menor de un rango de elementos (plantilla de función & objeto función de algoritmo) | |
(C++20) |
|
(C++11) |
determina si una secuencia es una permutación de otra secuencia (plantilla de función & objeto función de algoritmo) |
(C++20) |
|
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) |
(C++23) |
|
| 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) |
(C++17) |
similar a std::partial_sum, excluye el iésimo elemento de entrada de la iésima suma (plantilla de función) |
(C++17) |
similar a std::partial_sum, incluye el iésimo elemento de entrada en la iésima suma (plantilla de función) |
(C++17) |
aplica un invocable, luego reduce fuera de orden (plantilla de función) |
(C++17) |
aplica un invocable, luego calcula el barrido exclusivo (plantilla de función) |
(C++17) |
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> | |
(C++26) |
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
|