std::ranges::is_sorted
| Definido en el encabezado <algorithm>
|
||
| Firma de llamada |
||
template< std::forward_iterator I, std::sentinel_for<I> S,
class Proj = std::identity,
std::indirect_strict_weak_order<std::projected<I, Proj>>
Comp = ranges::less >
constexpr bool
is_sorted( I first, S last, Comp comp = {}, Proj proj = {} );
|
(1) | (desde C++20) |
template< ranges::forward_range R, class Proj = std::identity,
std::indirect_strict_weak_order<
std::projected<ranges::iterator_t<R>, Proj>>
Comp = ranges::less >
constexpr bool
is_sorted( R&& r, Comp comp = {}, Proj proj = {} );
|
(2) | (desde C++20) |
Comprueba si los elementos en el rango [first, last) están ordenados en orden no descendente.
Una secuencia está ordenada con respecto a un comparador comp si para cualquier iterador it que apunte a la secuencia y cualquier entero no negativo n tal que it + n sea un iterador válido que apunte a un elemento de la secuencia, std::invoke(comp, std::invoke(proj, *(it + n)), std::invoke(proj, *it)) se evalúa como false.
comp.r como el rango fuente, como si se usara ranges::begin(r) como first y ranges::end(r) como last.Las entidades similares a funciones descritas en esta página son objetos de función de algoritmo (informalmente conocidos como niebloids), es decir:
- No se pueden especificar listas explícitas de argumentos de plantilla al llamar a cualquiera de ellos.
- Ninguno de ellos es visible para la búsqueda dependiente de argumentos.
- Cuando cualquiera de ellos es encontrado por búsqueda normal no calificada como el nombre a la izquierda del operador de llamada de función, la búsqueda dependiente de argumentos se inhibe.
Parámetros
| first, last | - | el par iterador-centinela que define el rango de elementos a verificar si está ordenado |
| r | - | el rango de elementos a verificar si está ordenado |
| comp | - | función de comparación a aplicar a los elementos proyectados |
| proj | - | proyección a aplicar a los elementos |
Valor de retorno
true
si los elementos en el rango están ordenados según
comp
.
Complejidad
Lineal en la distancia entre first y last .
Implementación posible
struct is_sorted_fn { template<std::forward_iterator I, std::sentinel_for<I> S, class Proj = std::identity, std::indirect_strict_weak_order<std::projected<I, Proj>> Comp = ranges::less> constexpr bool operator()(I first, S last, Comp comp = {}, Proj proj = {}) const { return ranges::is_sorted_until(first, last, comp, proj) == last; } template<ranges::forward_range R, class Proj = std::identity, std::indirect_strict_weak_order< std::projected<ranges::iterator_t<R>, Proj>> Comp = ranges::less> constexpr bool operator()(R&& r, Comp comp = {}, Proj proj = {}) const { return (*this)(ranges::begin(r), ranges::end(r), std::ref(comp), std::ref(proj)); } }; inline constexpr is_sorted_fn is_sorted; |
Notas
ranges::is_sorted
devuelve
true
para rangos vacíos y rangos de longitud uno.
Ejemplo
#include <algorithm> #include <array> #include <functional> #include <iostream> #include <iterator> int main() { namespace ranges = std::ranges; std::array digits {3, 1, 4, 1, 5}; ranges::copy(digits, std::ostream_iterator<int>(std::cout, " ")); ranges::is_sorted(digits) ? std::cout << ": ordenado\n" : std::cout << ": no ordenado\n"; ranges::sort(digits); ranges::copy(digits, std::ostream_iterator<int>(std::cout, " ")); ranges::is_sorted(ranges::begin(digits), ranges::end(digits)) ? std::cout << ": ordenado\n" : std::cout << ": no ordenado\n"; ranges::reverse(digits); ranges::copy(digits, std::ostream_iterator<int>(std::cout, " ")); ranges::is_sorted(digits, ranges::greater {}) ? std::cout << ": ordenado (con 'greater')\n" : std::cout << ": no ordenado\n"; }
Salida:
3 1 4 1 5 : no ordenado 1 1 3 4 5 : ordenado 5 4 3 1 1 : ordenado (con 'greater')
Véase también
(C++20) |
encuentra el subrango ordenado más grande (objeto función de algoritmo) |
(C++11) |
comprueba si un rango está ordenado (plantilla de función) |