std:: lexicographical_compare
|
Definido en el encabezado
<algorithm>
|
||
|
template
<
class
InputIt1,
class
InputIt2
>
bool
lexicographical_compare
(
InputIt1 first1, InputIt1 last1,
|
(1) | (constexpr desde C++20) |
|
template
<
class
ExecutionPolicy,
class
ForwardIt1,
class
ForwardIt2
>
|
(2) | (desde C++17) |
|
template
<
class
InputIt1,
class
InputIt2,
class
Compare
>
bool
lexicographical_compare
(
InputIt1 first1, InputIt1 last1,
|
(3) | (constexpr desde C++20) |
|
template
<
class
ExecutionPolicy,
class
ForwardIt1,
class
ForwardIt2,
class
Compare
>
|
(4) | (desde C++17) |
Comprueba si el primer rango
[
first1
,
last1
)
es lexicográficamente
menor
que el segundo rango
[
first2
,
last2
)
.
|
std:: is_execution_policy_v < std:: decay_t < ExecutionPolicy >> es true . |
(hasta C++20) |
|
std:: is_execution_policy_v < std:: remove_cvref_t < ExecutionPolicy >> es true . |
(desde C++20) |
La comparación lexicográfica es una operación con las siguientes propiedades:
- Dos rangos se comparan elemento por elemento.
- El primer elemento que no coincide define qué rango es lexicográficamente menor o mayor que el otro.
- Si un rango es un prefijo de otro, el rango más corto es lexicográficamente menor que el otro.
- Si dos rangos tienen elementos equivalentes y son de la misma longitud, entonces los rangos son lexicográficamente iguales .
- Un rango vacío es lexicográficamente menor que cualquier rango no vacío.
- Dos rangos vacíos son lexicográficamente iguales .
Contenidos |
Parámetros
| first1, last1 | - | el par de iteradores que define el primer rango de elementos a examinar |
| first2, last2 | - | el par de iteradores que define el segundo rango de elementos a examinar |
| policy | - | la política de ejecución a utilizar |
| 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 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 pasados a ella y debe poder aceptar todos los valores de tipo (posiblemente const)
|
| Requisitos de tipo | ||
-
InputIt1, InputIt2
deben cumplir con los requisitos de
LegacyInputIterator
.
|
||
-
ForwardIt1, ForwardIt2
deben cumplir con los requisitos de
LegacyForwardIterator
.
|
||
-
Compare
debe cumplir con los requisitos de
Compare
.
|
||
Valor de retorno
true si el primer rango es lexicográficamente menor que el segundo, de lo contrario false .
Complejidad
Dado N 1 como std:: distance ( first1, last1 ) y N 2 como std:: distance ( first2, last2 ) :
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
ExecutionPolicyes uno de los standard policies , std::terminate es llamado. Para cualquier otroExecutionPolicy, el comportamiento está definido por la implementación. - Si el algoritmo falla al asignar memoria, std::bad_alloc es lanzado.
Implementación posible
| lexicographical_compare (1) |
|---|
template<class InputIt1, class InputIt2> bool lexicographical_compare(InputIt1 first1, InputIt1 last1, InputIt2 first2, InputIt2 last2) { for (; (first1 != last1) && (first2 != last2); ++first1, (void) ++first2) { if (*first1 < *first2) return true; if (*first2 < *first1) return false; } return (first1 == last1) && (first2 != last2); } |
| lexicographical_compare (3) |
template<class InputIt1, class InputIt2, class Compare> bool lexicographical_compare(InputIt1 first1, InputIt1 last1, InputIt2 first2, InputIt2 last2, Compare comp) { for (; (first1 != last1) && (first2 != last2); ++first1, (void) ++first2) { if (comp(*first1, *first2)) return true; if (comp(*first2, *first1)) return false; } return (first1 == last1) && (first2 != last2); } |
Ejemplo
#include <algorithm> #include <iostream> #include <random> #include <vector> void print(const std::vector<char>& v, auto suffix) { for (char c : v) std::cout << c << ' '; std::cout << suffix; } int main() { std::vector<char> v1{'a', 'b', 'c', 'd'}; std::vector<char> v2{'a', 'b', 'c', 'd'}; for (std::mt19937 g{std::random_device{}()}; !std::lexicographical_compare(v1.begin(), v1.end(), v2.begin(), v2.end());) { print(v1, ">= "); print(v2, '\n'); std::shuffle(v1.begin(), v1.end(), g); std::shuffle(v2.begin(), v2.end(), g); } print(v1, "< "); print(v2, '\n'); }
Salida posible:
a b c d >= a b c d d a b c >= c b d a b d a c >= a d c b a c d b < c d a b
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 |
|---|---|---|---|
| LWG 142 | C++98 |
se permitían como máximo
min(N
1
,N
2
)
comparaciones, pero eso
no es posible (la equivalencia se determina con 2 comparaciones) |
duplicó el límite |
| LWG 1205 | C++98 | los resultados de las comparaciones lexicográficas que involucraban rangos vacíos no eran claros | se aclaró |
Véase también
|
determina si dos conjuntos de elementos son iguales
(plantilla de función) |
|
|
compara dos rangos usando comparación de tres vías
(plantilla de función) |
|
|
(C++20)
|
devuelve
true
si un rango es lexicográficamente menor que otro
(objeto función de algoritmo) |