Namespaces
Variants

std:: lexicographical_compare_three_way

From cppreference.net
Algorithm library
Constrained algorithms and algorithms on ranges (C++20)
Constrained algorithms, e.g. ranges::copy , ranges::sort , ...
Execution policies (C++17)
Non-modifying sequence operations
Batch operations
(C++17)
Search operations
Modifying sequence operations
Copy operations
(C++11)
(C++11)
Swap operations
Transformation operations
Generation operations
Removing operations
Order-changing operations
(until C++17) (C++11)
(C++20) (C++20)
Sampling operations
(C++17)

Sorting and related operations
Partitioning operations
Sorting operations
Binary search operations
(on partitioned ranges)
Set operations (on sorted ranges)
Merge operations (on sorted ranges)
Heap operations
Minimum/maximum operations
Lexicographical comparison operations
lexicographical_compare_three_way
(C++20)
Permutation operations
C library
Numeric operations
Operations on uninitialized memory
Definido en el encabezado <algorithm>
template < class InputIt1, class InputIt2, class Cmp >

constexpr auto lexicographical_compare_three_way
( InputIt1 first1, InputIt1 last1, InputIt2 first2, InputIt2 last2,

Cmp comp ) - > decltype ( comp ( * first1, * first2 ) ) ;
(1) (desde C++20)
template < class InputIt1, class InputIt2 >

constexpr auto lexicographical_compare_three_way

( InputIt1 first1, InputIt1 last1, InputIt2 first2, InputIt2 last2 ) ;
(2) (desde C++20)

Compara lexicográficamente dos rangos [ first1 , last1 ) y [ first2 , last2 ) usando comparación de tres vías y produce un resultado del tipo de categoría de comparación aplicable más fuerte.

1) Devuelve el orden entre el primer par de elementos no equivalentes según comp en ambos rangos si existe alguno, de lo contrario (si un rango es equivalente al prefijo de otro según comp ), devuelve el orden entre la longitud de ambos rangos.
2) Equivalente a return std :: lexicographical_compare_three_way (
first1, last1, first2, last2, std:: compare_three_way ( ) ) ;

Si el tipo de retorno no es uno de los tres tipos de categorías de comparación, el programa está mal formado:

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
comp - un objeto de función
Requisitos de tipo
-
InputIt1, InputIt2 deben cumplir con los requisitos de LegacyInputIterator .

Valor de retorno

El valor de un tipo de categoría de comparación especificado anteriormente.

Complejidad

Dado N 1 como std:: distance ( first1, last1 ) y N 2 como std:: distance ( first2, last2 ) :

1) Como máximo min( 1 ,N 2 ) aplicaciones de comp .
2) Como máximo min(N 1 ,N 2 ) aplicaciones de std:: compare_three_way ( ) .

Implementación posible

template<class I1, class I2, class Cmp>
constexpr auto lexicographical_compare_three_way(I1 f1, I1 l1, I2 f2, I2 l2, Cmp comp)
    -> decltype(comp(*f1, *f2))
{
    using ret_t = decltype(comp(*f1, *f2));
    static_assert(std::disjunction_v<
                      std::is_same<ret_t, std::strong_ordering>,
                      std::is_same<ret_t, std::weak_ordering>,
                      std::is_same<ret_t, std::partial_ordering>>,
                  "El tipo de retorno debe ser un tipo de categoría de comparación.");
    bool exhaust1 = (f1 == l1);
    bool exhaust2 = (f2 == l2);
    for (; !exhaust1 && !exhaust2; exhaust1 = (++f1 == l1), exhaust2 = (++f2 == l2))
        if (auto c = comp(*f1, *f2); c != 0)
            return c;
    return !exhaust1 ? std::strong_ordering::greater:
           !exhaust2 ? std::strong_ordering::less:
                       std::strong_ordering::equal;
}

Ejemplo

#include <algorithm>
#include <cctype>
#include <compare>
#include <iomanip>
#include <iostream>
#include <string_view>
#include <utility>
using namespace std::literals;
void show_result(std::string_view s1, std::string_view s2, std::strong_ordering o)
{
    std::cout << std::quoted(s1) << " is ";
    std::is_lt(o) ? std::cout << "less than ":
    std::is_gt(o) ? std::cout << "greater than ":
                    std::cout << "equal to ";
    std::cout << std::quoted(s2) << '\n';
}
std::strong_ordering cmp_icase(unsigned char x, unsigned char y)
{
    return std::toupper(x) <=> std::toupper(y);
};
int main()
{
    for (const auto& [s1, s2] :
    {
        std::pair{"one"sv, "ONE"sv}, {"two"sv, "four"sv}, {"three"sv, "two"sv}
    })
    {
        const auto res = std::lexicographical_compare_three_way(
            s1.cbegin(), s1.cend(), s2.cbegin(), s2.cend(), cmp_icase);
        show_result(s1, s2, res);
    }
}

Salida:

"one" is equal to "ONE"
"two" is greater than "four"
"three" is less than "two"

Informes de defectos

Los siguientes informes de defectos que modifican el comportamiento se aplicaron retroactivamente a los estándares de C++ publicados anteriormente.

DR Applied to Behavior as published Correct behavior
LWG 3410 C++20 se requerían comparaciones innecesarias entre iteradores se eliminó dicho requisito

Véase también

devuelve true si un rango es lexicográficamente menor que otro
(plantilla de función)
objeto función restringido que implementa x <=> y
(clase)
devuelve true si un rango es lexicográficamente menor que otro
(objeto función algoritmo)