Namespaces
Variants

std::ranges::is_sorted

De es.cppreference.net
 
 
Biblioteca de algoritmos
Algoritmos restringidos y algoritmos sobre rangos (C++20)
Algoritmos restringidos, por ejemplo, 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)

Ordenación y operaciones relacionadas
Operaciones de particionado
(C++11)    

Operaciones de ordenación
Operaciones de búsqueda binaria
(en rangos particionados)
Operaciones de conjuntos (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


 
Algoritmos restringidos
Todos los nombres en este menú pertenecen al espacio de nombres std::ranges
Operaciones de secuencia no modificadoras
Operaciones de secuencia modificadoras
Operaciones de particionado
Operaciones de ordenación
Operaciones de búsqueda binaria (en rangos ordenados)
       
       
Operaciones de conjuntos (en rangos ordenados)
Operaciones de montículo
Operaciones de mínimo/máximo
       
       
Operaciones de permutación
Operaciones de plegado
Operaciones sobre almacenamiento no inicializado
Tipos de retorno
 
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.

1) Los elementos se comparan utilizando la función de comparación binaria dada comp.
2) Igual que (1), pero usa 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:

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

encuentra el subrango ordenado más grande
(objeto función de algoritmo)
(C++11)
comprueba si un rango está ordenado
(plantilla de función)