Constrained algorithms (since C++20)
C++20 proporciona
versiones restringidas
de la mayoría de 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
range
, y se admiten proyecciones y objetos llamables de puntero-a-miembro. Adicionalmente, los
tipos de retorno
de la mayoría de algoritmos han sido modificados para devolver toda la información potencialmente útil calculada durante la ejecución del algoritmo.
Objetos función de algoritmos
Un objeto función algoritmo (AFO), conocido informalmente como niebloid , es un objeto 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 correspondiente objeto función algoritmo.
Para un objeto función de algoritmo
o
, sea
S
el conjunto correspondiente de plantillas de función. Entonces para cualquier secuencia de argumentos
args...
,
o
(
args...
)
es
equivalente-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 la búsqueda no calificada normal como el nombre a la izquierda del operador de llamada a función, la búsqueda dependiente de argumentos queda inhibida.
Algoritmos restringidos
|
Definido en el encabezado
<algorithm>
|
|
|
Definido en el espacio de nombres
std::ranges
|
|
Operaciones de secuencia no modificadoras |
|
|
(C++20)
(C++20)
(C++20)
|
verifica si un predicado es
true
para todos, alguno o ninguno de los elementos en un rango
(objeto función de algoritmo) |
|
(C++20)
|
aplica un
objeto función
unario a elementos de un
rango
(objeto función algoritmo) |
|
(C++20)
|
aplica un objeto función a los primeros N elementos de una secuencia
(objeto función de algoritmo) |
|
(C++20)
(C++20)
|
devuelve el número de elementos que cumplen criterios específicos
(objeto función de algoritmo) |
|
(C++20)
|
encuentra la primera posición donde dos rangos difieren
(objeto función de algoritmo) |
|
(C++20)
|
determina si dos conjuntos de elementos son iguales
(objeto función de algoritmo) |
|
(C++20)
|
devuelve
true
si un rango es lexicográficamente menor que otro
(objeto función algoritmo) |
|
(C++20)
(C++20)
(C++20)
|
encuentra el primer elemento que satisface criterios específicos
(objeto función de algoritmo) |
|
(C++23)
(C++23)
(C++23)
|
encuentra el último elemento que satisface criterios específicos
(objeto función de algoritmo) |
|
(C++20)
|
encuentra la última secuencia de elementos en un rango determinado
(objeto función de algoritmo) |
|
(C++20)
|
busca cualquiera de un conjunto de elementos
(objeto función de algoritmo) |
|
(C++20)
|
encuentra los dos primeros elementos adyacentes que son iguales (o satisfacen un predicado dado)
(objeto función de algoritmo) |
|
(C++20)
|
busca la primera ocurrencia de un rango de elementos
(objeto función de algoritmo) |
|
(C++20)
|
busca la primera ocurrencia de un número de copias consecutivas de un elemento en un rango
(objeto función de algoritmo) |
|
(C++23)
(C++23)
|
verifica si el rango contiene el elemento o subrango dado
(objeto función de algoritmo) |
|
(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 modificación de secuencias |
|
|
(C++20)
(C++20)
|
copia un rango de elementos a una nueva ubicación
(objeto función de algoritmo) |
|
(C++20)
|
copia un número de elementos a una nueva ubicación
(objeto función de algoritmo) |
|
(C++20)
|
copia un rango de elementos en orden inverso
(objeto función de algoritmo) |
|
(C++20)
|
mueve un rango de elementos a una nueva ubicación
(objeto función de algoritmo) |
|
(C++20)
|
mueve un rango de elementos a una nueva ubicación en orden inverso
(objeto función de algoritmo) |
|
(C++20)
|
asigna un rango de elementos un valor determinado
(objeto función de algoritmo) |
|
(C++20)
|
asigna un valor a una cantidad de elementos
(objeto función de algoritmo) |
|
(C++20)
|
aplica una función a un rango 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) |
|
(C++20)
(C++20)
|
elimina elementos que cumplen criterios específicos
(objeto función de algoritmo) |
|
(C++20)
(C++20)
|
copia un rango de elementos omitiendo aquellos que cumplen criterios específicos
(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 elementos que cumplen criterios específicos con otro valor
(objeto función de algoritmo) |
|
(C++20)
|
intercambia dos rangos de elementos
(objeto función de algoritmo) |
|
(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++20)
|
reordena aleatoriamente los elementos en un rango
(objeto función de algoritmo) |
|
desplaza elementos en un rango
(objeto función de algoritmo) |
|
|
(C++20)
|
selecciona N elementos aleatorios de una secuencia
(objeto función de algoritmo) |
|
(C++20)
|
elimina elementos duplicados consecutivos en un rango
(objeto función de algoritmo) |
|
(C++20)
|
crea una copia de algún rango de elementos que no contiene duplicados consecutivos
(objeto función de algoritmo) |
Operaciones de particionado |
|
|
(C++20)
|
determina si el rango está particionado por el predicado dado
(objeto función 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 preservando su orden relativo
(objeto función de algoritmo) |
|
(C++20)
|
localiza el punto de partición de un rango particionado
(objeto función de algoritmo) |
Operaciones de ordenamiento |
|
|
(C++20)
|
verifica si un rango está ordenado en orden ascendente
(objeto función de algoritmo) |
|
(C++20)
|
encuentra el subrango ordenado más grande
(objeto función de algoritmo) |
|
(C++20)
|
ordena un rango en orden ascendente
(objeto función de algoritmo) |
|
(C++20)
|
ordena los primeros N elementos de un rango
(objeto función de algoritmo) |
|
(C++20)
|
copia y ordena parcialmente un rango de elementos
(objeto función de algoritmo) |
|
(C++20)
|
ordena un rango de elementos preservando el orden entre elementos iguales
(objeto función de algoritmo) |
|
(C++20)
|
ordena parcialmente el rango dado asegurando que esté particionado por el elemento especificado
(objeto función de algoritmo) |
Operaciones de búsqueda binaria (en rangos ordenados) |
|
|
(C++20)
|
devuelve un iterador al primer elemento
no menor
que el valor dado
(objeto función de algoritmo) |
|
(C++20)
|
devuelve un iterador al primer elemento
mayor
que cierto valor
(objeto función de algoritmo) |
|
(C++20)
|
determina si un elemento existe en un rango parcialmente ordenado
(objeto función de algoritmo) |
|
(C++20)
|
devuelve el rango de elementos que coinciden con una clave específica
(objeto función de algoritmo) |
Operaciones de conjunto (sobre rangos ordenados) |
|
|
(C++20)
|
combina dos rangos ordenados
(objeto función de algoritmo) |
|
(C++20)
|
combina dos rangos ordenados in situ
(objeto función de algoritmo) |
|
(C++20)
|
devuelve
true
si una secuencia es una 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) |
|
(C++20)
|
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 heap |
|
|
(C++20)
|
verifica si el rango dado es un max heap
(objeto función de algoritmo) |
|
(C++20)
|
encuentra el mayor subrango que es un montículo máximo
(objeto función de algoritmo) |
|
(C++20)
|
crea un montículo máximo a partir de un rango de elementos
(objeto función de algoritmo) |
|
(C++20)
|
añade un elemento a un montículo máximo
(objeto función de algoritmo) |
|
(C++20)
|
elimina el elemento más grande de un montículo máximo
(objeto función de algoritmo) |
|
(C++20)
|
convierte un max heap en un rango de elementos ordenados en orden ascendente
(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 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 restringidas
|
Definido en el encabezado
<numeric>
|
|
|
Definido en el espacio de nombres
std::ranges
|
|
|
(C++23)
|
llena un rango con incrementos sucesivos del valor inicial
(objeto función algoritmo) |
Operaciones de plegado restringidas
|
Definido en el encabezado
<algorithm>
|
|
|
Definido en el espacio de nombres
std::ranges
|
|
|
(C++23)
|
pliega hacia la izquierda un rango de elementos
(objeto función algoritmo) |
|
(C++23)
|
pliega hacia la izquierda un rango de elementos usando el primer elemento como valor inicial
(objeto función algoritmo) |
|
(C++23)
|
pliega hacia la derecha un rango de elementos
(objeto función algoritmo) |
|
(C++23)
|
pliega hacia la derecha un rango de elementos usando el último elemento como valor inicial
(objeto función algoritmo) |
|
(C++23)
|
pliega hacia la izquierda un rango de elementos, y retorna un
pair
(iterador, valor)
(objeto función 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 algoritmo) |
|
Algoritmos de memoria no inicializada restringidos
|
Definido en el encabezado
<memory>
|
|
|
Definido en el espacio de nombres
std::ranges
|
|
|
(C++20)
|
copia un rango de objetos a un área de memoria no inicializada
(objeto función algoritmo) |
|
(C++20)
|
copia un número de objetos a un área de memoria no inicializada
(objeto función algoritmo) |
|
(C++20)
|
copia un objeto a un área de memoria no inicializada, definida por un rango
(objeto función algoritmo) |
|
(C++20)
|
copia un objeto a un área de memoria no inicializada, definida por un inicio y un contador
(objeto función algoritmo) |
|
(C++20)
|
mueve un rango de objetos a un área de memoria no inicializada
(objeto función algoritmo) |
|
(C++20)
|
mueve un número de objetos a un área de memoria no inicializada
(objeto función algoritmo) |
|
construye objetos mediante
inicialización por defecto
en un área de memoria no inicializada, definida por un rango
(objeto función algoritmo) |
|
|
construye objetos mediante
inicialización por defecto
en un área de memoria no inicializada, definida por un inicio y contador
(objeto función algoritmo) |
|
|
construye objetos mediante
inicialización por valor
en un área de memoria no inicializada, definida por un rango
(objeto función algoritmo) |
|
|
construye objetos mediante
inicialización por valor
en un área de memoria no inicializada, definida por un inicio y un contador
(objeto función algoritmo) |
|
|
(C++20)
|
destruye un rango de objetos
(objeto función algoritmo) |
|
(C++20)
|
destruye un número de objetos en un rango
(objeto función algoritmo) |
|
(C++20)
|
destruye un objeto en una dirección dada
(objeto función algoritmo) |
|
(C++20)
|
crea un objeto en una dirección dada
(objeto función algoritmo) |
Algoritmos de números aleatorios con restricciones
|
Definido en el encabezado
<random>
|
|
|
Definido en el espacio de nombres
std::ranges
|
|
|
(C++26)
|
llena un rango con números aleatorios de un generador uniforme de bits aleatorios
(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
| Macro de prueba de características | Valor | Estándar | Característica |
|---|---|---|---|
__cpp_lib_algorithm_default_value_type
|
202403L
|
(C++26) | Inicialización de lista para algoritmos |
__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 de plegado
|
__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 los estándares de C++ publicados anteriormente.
| DR | Aplicado a | Comportamiento publicado | Comportamiento correcto |
|---|---|---|---|
| P3136R1 | C++20 |
se permitía que los niebloids se especificaran como entidades especiales
distintas de objetos función |
se requiere que se especifiquen como objetos función |