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 par iterador-centinela o como un único argumento rango, y se soportan proyecciones y objetos invocables puntero a miembro. Además, los tipos de retorno de la mayoría de los algoritmos se han modificado para devolver toda la información potencialmente útil calculada durante la ejecución del algoritmo.
Objetos de función de algoritmo
Un objeto de función de algoritmo (AFO), informalmente conocido como niebloid , es un objeto de punto de personalización (CPO) que se especifica como una o más plantillas de función sobrecargadas. El nombre de estas plantillas de función designa el objeto de función de algoritmo correspondiente.
Para un objeto de función de algoritmo o, sea S el correspondiente conjunto de plantillas de función. Entonces, para cualquier secuencia de argumentos args..., o(args...) es equivalente en expresión a s(args...), donde el resultado de la búsqueda de nombre para s es el conjunto de sobrecarga S.
Los algoritmos restringidos en el espacio de nombres std::ranges se definen como objetos de función de algoritmo. Como resultado:
- No se pueden especificar listas de argumentos de plantilla explícitas al llamar a cualquiera de ellos.
- Ninguno de ellos es visible para la búsqueda dependiente de argumentos.
- Cuando cualquiera de ellos es encontrado mediante búsqueda normal no cualificada como el nombre a la izquierda del operador de llamada a función, la búsqueda dependiente de argumentos se inhibe.
Parámetros de rango
Algunas sobrecargas toman argumentos rango, se comportan como si estuvieran implementadas mediante el envío a la sobrecarga correspondiente en el espacio de nombres ranges que toma argumentos separados de iterador y centinela, donde para cada argumento de rango r:
- El argumento de iterador correspondiente se inicializa con
ranges::begin(r).
|
(hasta C++26) |
|
(desde C++26) |
Operaciones de secuencia no modificadoras
Definido en el encabezado
<algorithm> | |
Definido en el espacio de nombres
std::ranges | |
Operaciones por lotes | |
(C++20) |
aplica un objeto función a los elementos de un rango (objeto función de algoritmo) |
(C++20) |
aplica un objeto función a los primeros N elementos de una secuencia (objeto función de algoritmo) |
Operaciones de búsqueda | |
(C++20)(C++20)(C++20) |
comprueba si un predicado es true para todos, alguno o ninguno de los elementos de un rango(objeto de función de algoritmo) |
(C++23)(C++23) |
comprueba si el rango contiene el elemento o subrango dado (objeto de función de algoritmo) |
(C++20)(C++20)(C++20) |
encuentra el primer elemento que satisface criterios específicos (objeto de función de algoritmo) |
(C++23)(C++23)(C++23) |
encuentra el último elemento que satisface criterios específicos (objeto de función de algoritmo) |
(C++20) |
encuentra la última secuencia de elementos en un rango determinado (objeto de función de algoritmo) |
(C++20) |
busca cualquier elemento de un conjunto (objeto de función de algoritmo) |
(C++20) |
encuentra los dos primeros elementos adyacentes que son iguales (o que satisfacen un predicado dado) (objeto de función de algoritmo) |
(C++20)(C++20) |
devuelve el número de elementos que satisfacen criterios específicos (objeto de función de algoritmo) |
(C++20) |
encuentra la primera posición donde dos rangos difieren (objeto de función de algoritmo) |
(C++20) |
determina si dos conjuntos de elementos son iguales (objeto de función de algoritmo) |
(C++20) |
busca la primera aparición de un rango de elementos (objeto de función de algoritmo) |
(C++20) |
busca la primera aparición de un número de copias consecutivas de un elemento en un rango (objeto de función de algoritmo) |
(C++23) |
comprueba si un rango comienza con otro rango (objeto de función de algoritmo) |
(C++23) |
comprueba si un rango termina con otro rango (objeto de función de algoritmo) |
Operaciones de plegado | |
(C++23) |
pliega a la izquierda un rango de elementos (objeto función de algoritmo) |
(C++23) |
pliega a la izquierda un rango de elementos usando el primer elemento como valor inicial (objeto función de algoritmo) |
(C++23) |
pliega a la derecha un rango de elementos (objeto función de algoritmo) |
(C++23) |
pliega a la derecha un rango de elementos usando el último elemento como valor inicial (objeto función de algoritmo) |
(C++23) |
pliega a la izquierda un rango de elementos, y devuelve un pair (iterador, valor) (objeto función de algoritmo) |
| pliega a la izquierda un rango de elementos usando el primer elemento como valor inicial, y devuelve un pair (iterador, optional) (objeto función de algoritmo) | |
Operaciones de modificación de secuencias
Definido en el encabezado
<algorithm> | |
Definido en el espacio de nombres
std::ranges | |
Operaciones de copia | |
(C++20)(C++20) |
copia un rango de elementos a una nueva ubicación (objeto de función de algoritmo) |
(C++20) |
copia un número de elementos a una nueva ubicación (objeto de función de algoritmo) |
(C++20) |
copia un rango de elementos en orden inverso (objeto de función de algoritmo) |
(C++20) |
mueve un rango de elementos a una nueva ubicación (objeto de función de algoritmo) |
(C++20) |
mueve un rango de elementos a una nueva ubicación en orden inverso (objeto de función de algoritmo) |
Operaciones de intercambio | |
(C++20) |
intercambia dos rangos de elementos (objeto función de algoritmo) |
Operaciones de transformación | |
(C++20) |
aplica una función a un rango de elementos (objeto función de algoritmo) |
(C++20)(C++20) |
reemplaza todos los valores que cumplen criterios específicos con otro valor (objeto función de algoritmo) |
(C++20)(C++20) |
copia un rango, reemplazando los elementos que cumplen criterios específicos con otro valor (objeto función de algoritmo) |
Operaciones de generación | |
(C++20) |
asigna un cierto valor a un rango de elementos (objeto función de algoritmo) |
(C++20) |
asigna un valor a un número de elementos (objeto función de algoritmo) |
(C++20) |
guarda el resultado de una función en un rango (objeto función de algoritmo) |
(C++20) |
guarda el resultado de N aplicaciones de una función (objeto función de algoritmo) |
Operaciones de eliminación | |
(C++20)(C++20) |
elimina elementos que cumplen criterios específicos (objeto de función de algoritmo) |
(C++20)(C++20) |
copia un rango de elementos omitiendo aquellos que cumplen criterios específicos (objeto de función de algoritmo) |
(C++20) |
elimina elementos duplicados consecutivos en un rango (objeto de función de algoritmo) |
(C++20) |
crea una copia de algún rango de elementos que no contiene duplicados consecutivos (objeto de función de algoritmo) |
Operaciones que cambian el orden | |
(C++20) |
invierte el orden de los elementos en un rango (objeto función de algoritmo) |
(C++20) |
crea una copia de un rango que está invertido (objeto función de algoritmo) |
(C++20) |
rota el orden de los elementos en un rango (objeto función de algoritmo) |
(C++20) |
copia y rota un rango de elementos (objeto función de algoritmo) |
(C++23)(C++23) |
desplaza elementos en un rango (objeto función de algoritmo) |
(C++20) |
reordena aleatoriamente elementos en un rango (objeto función de algoritmo) |
Operaciones de muestreo | |
(C++20) |
selecciona N elementos aleatorios de una secuencia (objeto función de algoritmo) |
Definido en el encabezado
<algorithm> | |
Definido en el espacio de nombres
std::ranges | |
Operaciones de partición | |
(C++20) |
determina si el rango está particionado por el predicado dado (objeto función de algoritmo) |
(C++20) |
divide un rango de elementos en dos grupos (objeto función de algoritmo) |
(C++20) |
copia un rango dividiendo los elementos en dos grupos (objeto función de algoritmo) |
(C++20) |
divide los elementos en dos grupos mientras preserva su orden relativo dentro de cada grupo (objeto función de algoritmo) |
(C++20) |
localiza el punto de partición de un rango particionado (objeto función de algoritmo) |
Operaciones de ordenación | |
(C++20) |
comprueba si un rango está ordenado (objeto de función de algoritmo) |
(C++20) |
encuentra el subrango ordenado más grande (objeto de función de algoritmo) |
(C++20) |
ordena un rango de elementos (objeto de función de algoritmo) |
(C++20) |
ordena los primeros N elementos de un rango (objeto de función de algoritmo) |
(C++20) |
copia y ordena parcialmente un rango de elementos (objeto de función de algoritmo) |
(C++20) |
ordena un rango de elementos preservando el orden relativo entre elementos equivalentes (objeto de función de algoritmo) |
(C++20) |
encuentra el N-ésimo elemento si el rango estuviera ordenado (objeto de función de algoritmo) |
Operaciones de búsqueda binaria (en rangos ordenados) | |
(C++20) |
encuentra el primer elemento no menor que el valor dado mediante búsqueda binaria (objeto de función de algoritmo) |
(C++20) |
encuentra el primer elemento mayor que el valor dado mediante búsqueda binaria (objeto de función de algoritmo) |
(C++20) |
determina si un elemento existe en un rango mediante búsqueda binaria (objeto de función de algoritmo) |
(C++20) |
encuentra el rango de elementos que coinciden con el valor dado mediante búsqueda binaria (objeto de función de algoritmo) |
Operaciones de conjuntos (en rangos ordenados) | |
(C++20) |
determina si una secuencia es subsecuencia de otra (objeto función de algoritmo) |
(C++20) |
calcula la diferencia entre dos conjuntos (objeto función de algoritmo) |
(C++20) |
calcula la intersección de dos conjuntos (objeto función de algoritmo) |
| calcula la diferencia simétrica entre dos conjuntos (objeto función de algoritmo) | |
(C++20) |
calcula la unión de dos conjuntos (objeto función de algoritmo) |
Operaciones de fusión (en rangos ordenados) | |
(C++20) |
fusiona dos rangos ordenados (objeto función de algoritmo) |
(C++20) |
fusiona dos rangos ordenados en el lugar (objeto función de algoritmo) |
Operaciones de heap | |
(C++20) |
comprueba si el rango dado es un heap máximo (objeto función de algoritmo) |
(C++20) |
encuentra el subrango más grande que es un heap máximo (objeto función de algoritmo) |
(C++20) |
crea un heap máximo a partir de un rango de elementos (objeto función de algoritmo) |
(C++20) |
agrega un elemento a un heap máximo (objeto función de algoritmo) |
(C++20) |
elimina el elemento más grande de un heap máximo (objeto función de algoritmo) |
(C++20) |
convierte un heap máximo en un rango ordenado de elementos (objeto función de algoritmo) |
Operaciones de mínimo/máximo |
|
|
(C++20)
|
devuelve el mayor de los valores dados
(objeto función de algoritmo) |
|
(C++20)
|
devuelve el elemento más grande en un rango
(objeto función de algoritmo) |
|
(C++20)
|
devuelve el menor de los valores dados
(objeto función de algoritmo) |
|
(C++20)
|
devuelve el elemento más pequeño en un rango
(objeto función de algoritmo) |
|
(C++20)
|
devuelve el menor y el mayor de dos elementos
(objeto función de algoritmo) |
|
(C++20)
|
devuelve los elementos más pequeño y más grande en un rango
(objeto función de algoritmo) |
|
(C++20)
|
limita un valor entre un par de valores límite
(objeto función de algoritmo) |
Operaciones de comparación lexicográfica | |
| compara dos rangos lexicográficamente (objeto de función de algoritmo) | |
Operaciones de permutación |
|
|
(C++20)
|
determina si una secuencia es una permutación de otra secuencia
(objeto función de algoritmo) |
|
(C++20)
|
genera la siguiente permutación lexicográfica mayor de un rango de elementos
(objeto función de algoritmo) |
|
(C++20)
|
genera la siguiente permutación lexicográfica más pequeña de un rango de elementos
(objeto función de algoritmo) |
Operaciones numéricas
Definido en el encabezado
<numeric> | |
Definido en espacio de nombres
std::ranges | |
(C++23) |
rellena un rango con incrementos sucesivos del valor inicial (objeto función de algoritmo) |
Especializados <memory> algoritmos
Definido en el encabezado
<memory> | |
Definido en el espacio de nombres
std::ranges | |
Construcción (por lotes) de objetos | |
(C++20) |
crea un objeto en una dirección dada (objeto de función de algoritmo) |
(C++20) |
copia un rango de objetos a un área de memoria no inicializada (objeto de función de algoritmo) |
(C++20) |
copia un número de objetos a un área de memoria no inicializada (objeto de función de algoritmo) |
(C++20) |
copia un objeto a un área de memoria no inicializada, definida por un rango (objeto de función de algoritmo) |
(C++20) |
copia un objeto a un área de memoria no inicializada, definida por un inicio y un conteo (objeto de función de algoritmo) |
(C++20) |
mueve un rango de objetos a un área de memoria no inicializada (objeto de función de algoritmo) |
(C++20) |
mueve un número de objetos a un área de memoria no inicializada (objeto de función de algoritmo) |
| construye objetos mediante inicialización por defecto en un área de memoria no inicializada, definida por un rango (objeto de función de algoritmo) | |
| construye objetos mediante inicialización por defecto en un área de memoria no inicializada, definida por un inicio y un conteo (objeto de función de algoritmo) | |
| construye objetos mediante inicialización por valor en un área de memoria no inicializada, definida por un rango (objeto de función de algoritmo) | |
| construye objetos mediante inicialización por valor en un área de memoria no inicializada, definida por un inicio y un conteo (objeto de función de algoritmo) | |
Destrucción de objetos (en lote) | |
(C++20) |
destruye un rango de objetos (objeto función de algoritmo) |
(C++20) |
destruye un número de objetos en un rango (objeto función de algoritmo) |
(C++20) |
destruye un objeto en una dirección dada (objeto función de algoritmo) |
Especializados <random> algoritmos
Definido en el encabezado
<random> | |
Definido en espacio de nombres
std::ranges | |
(C++26) |
llena un rango con números aleatorios a partir de un generador de bits aleatorio uniforme (objeto función de algoritmo) |
Tipos de retorno
|
Definido en el encabezado
<algorithm>
|
|
|
Definido en el espacio de nombres
std::ranges
|
|
|
(C++20)
|
proporciona una forma de almacenar un iterador y un objeto función como una única unidad
(plantilla de clase) |
|
(C++20)
|
proporciona una forma de almacenar dos iteradores como una única unidad
(plantilla de clase) |
|
(C++20)
|
proporciona una forma de almacenar dos iteradores como una única unidad
(plantilla de clase) |
|
(C++20)
|
proporciona una forma de almacenar tres iteradores como una única unidad
(plantilla de clase) |
|
(C++20)
|
proporciona una forma de almacenar tres iteradores como una única unidad
(plantilla de clase) |
|
(C++20)
|
proporciona una forma de almacenar dos objetos o referencias del mismo tipo como una única unidad
(plantilla de clase) |
|
(C++20)
|
proporciona una forma de almacenar un iterador y una bandera booleana como una única unidad
(plantilla de clase) |
|
(C++23)
|
proporciona una forma de almacenar un iterador y un valor como una única unidad
(plantilla de clase) |
|
(C++23)
|
proporciona una forma de almacenar un iterador y un valor como una única unidad
(plantilla de clase) |
Notas
| Prueba de características macro | Valor | Estándar | Característica |
|---|---|---|---|
__cpp_lib_algorithm_default_value_type |
202403L |
(C++26) | Inicialización de lista para algoritmos |
__cpp_lib_parallel_algorithm |
202506L |
(C++26) | Algoritmos de rango paralelos |
__cpp_lib_ranges |
201911L |
(C++20) | Biblioteca de rangos y algoritmos restringidos |
__cpp_lib_ranges_contains |
202207L |
(C++23) | std::ranges::contains |
__cpp_lib_ranges_find_last |
202207L |
(C++23) | std::ranges::find_last |
__cpp_lib_ranges_fold |
202207L |
(C++23) | std::ranges algoritmos fold
|
__cpp_lib_ranges_iota |
202202L |
(C++23) | std::ranges::iota |
__cpp_lib_ranges_starts_ends_with |
202106L |
(C++23) | std::ranges::starts_with, std::ranges::ends_with |
__cpp_lib_shift |
201806L |
(C++20) | std::shift_left, std::shift_right |
202202L |
(C++23) | std::ranges::shift_left, std::ranges::shift_right | |
__cpp_lib_ranges_generate_random |
202403L |
(C++26) | std::ranges::generate_random |
Informes de defectos
Los siguientes informes de defectos que modifican el comportamiento se aplicaron retroactivamente a estándares C++ publicados anteriormente.
| DR | Aplicado a | Comportamiento según lo publicado | Comportamiento correcto |
|---|---|---|---|
| P3136R1 | C++20 | niebloids se permitía que se especificaran como entidades especiales distintas de los objetos función |
se requería que se especificaran como objetos función |