Namespaces
Variants

std::is_sorted

De es.cppreference.net
 
 
Biblioteca de algoritmos
Algoritmos restringidos y algoritmos sobre rangos (C++20)
Algoritmos restringidos, p. ej. ranges::copy, ranges::sort, ...
Operaciones de secuencia no modificativas    
Operaciones por lotes
(C++17)
Operaciones de búsqueda
Operaciones de secuencia modificativas
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)

Ordenamiento y operaciones relacionadas
Operaciones de particionado
(C++11)    

Operaciones de ordenamiento
Operaciones de búsqueda binaria
(en rangos particionados)
Operaciones de conjuntos (en rangos ordenados)
Operaciones de mezcla (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


 
Definido en el encabezado <algorithm>
template< class ForwardIt >
bool is_sorted( ForwardIt first, ForwardIt last );
(1) (desde C++11)
(constexpr desde C++20)
template< class ExecutionPolicy, class ForwardIt >
bool is_sorted( ExecutionPolicy&& policy,
                ForwardIt first, ForwardIt last );
(2) (desde C++17)
template< class ForwardIt, class Compare >
bool is_sorted( ForwardIt first, ForwardIt last, Compare comp );
(3) (desde C++11)
(constexpr desde C++20)
template< class ExecutionPolicy, class ForwardIt, class Compare >
bool is_sorted( ExecutionPolicy&& policy,
                ForwardIt first, ForwardIt last, Compare comp );
(4) (desde C++17)

Comprueba si los elementos en el rango [first, last) están ordenados en orden no descendente.

1) Comprueba si los elementos están ordenados con respecto a operator<(hasta C++20)std::less{}(desde C++20).
3) Comprueba si los elementos están ordenados con respecto a comp.
2,4) Igual que (1,3), pero ejecutado de acuerdo a policy.
Estas sobrecargas participan en la resolución de sobrecarga solo si el valor de la siguiente expresión es true:

std::is_execution_policy_v<std::decay_t<ExecutionPolicy>>

(hasta C++20)

std::is_execution_policy_v<std::remove_cvref_t<ExecutionPolicy>>

(desde C++20)

Parámetros

first, last - el par de iteradores que definen el rango de elementos a examinar
policy - la política de ejecución a usar
comp - objeto función de comparación (es decir, un objeto que satisface los requisitos de Compare) que devuelve ​true si el primer argumento es menor que (es decir, está ordenado antes) el segundo.

La firma de la función de comparación debe ser equivalente a la siguiente:

bool cmp(const Type1& a, const Type2& b);

Aunque la firma no necesita tener const&, la función no debe modificar los objetos que se le pasan y debe poder aceptar todos los valores de tipo (posiblemente const) Type1 y Type2 independientemente de la categoría de valor (por lo tanto, Type1& no está permitido, ni tampoco Type1 a menos que para Type1 un movimiento sea equivalente a una copia(desde C++11)).
Los tipos Type1 y Type2 deben ser tales que un objeto de tipo ForwardIt pueda ser desreferenciado y luego convertido implícitamente a ambos. ​

Requisitos de tipo
-
ForwardIt debe cumplir los requisitos de LegacyForwardIterator.
-
Compare debe cumplir los requisitos de Compare.

Valor de retorno

true si los elementos en el rango están ordenados en orden no descendente, false en caso contrario.

Complejidad

Dado N como std::distance(first, last):

1,2) O(N) comparaciones usando operator<(hasta C++20)std::less{}(desde C++20).
3,4) O(N) aplicaciones del comparador comp.

Excepciones

Las sobrecargas con un parámetro de plantilla llamado ExecutionPolicy reportan errores de la siguiente manera:

  • Si la ejecución de una función invocada como parte del algoritmo lanza una excepción y ExecutionPolicy es una de las políticas estándar, se llama a std::terminate. Para cualquier otro ExecutionPolicy, el comportamiento está definido por la implementación.
  • Si el algoritmo falla al asignar memoria, se lanza std::bad_alloc.

Posible implementación

Véase también las implementaciones en libstdc++ y libc++.


is_sorted (1)
template<class ForwardIt>
bool is_sorted(ForwardIt first, ForwardIt last)
{
    return std::is_sorted_until(first, last) == last;
}
is_sorted (3)
template<class ForwardIt, class Compare>
bool is_sorted(ForwardIt first, ForwardIt last, Compare comp)
{
    return std::is_sorted_until(first, last, comp) == last;
}

Notas

std::is_sorted devuelve true para rangos vacíos y rangos de longitud uno.

Ejemplo

#include <algorithm>
#include <cassert>
#include <functional>
#include <iterator>
#include <vector>

int main()
{
    std::vector<int> v;
    assert(std::is_sorted(v.cbegin(), v.cend()) && "an empty range is always sorted");
    v.push_back(42);
    assert(std::is_sorted(v.cbegin(), v.cend()) && "a range of size 1 is always sorted");
    
    int data[] = {3, 1, 4, 1, 5};
    assert(not std::is_sorted(std::begin(data), std::end(data)));
    
    std::sort(std::begin(data), std::end(data));
    assert(std::is_sorted(std::begin(data), std::end(data)));
    assert(not std::is_sorted(std::begin(data), std::end(data), std::greater<>{}));
}

Véase también

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