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
Défini dans l'en-tête <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) (depuis C++20)
template < class InputIt1, class InputIt2 >

constexpr auto lexicographical_compare_three_way

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

Compare lexicographiquement deux intervalles [ first1 , last1 ) et [ first2 , last2 ) en utilisant la comparaison à trois voies et produit un résultat du type de catégorie de comparaison applicable le plus fort.

1) Retourne l'ordre entre la première paire d'éléments non équivalents selon comp dans les deux plages si elle existe, sinon (si une plage est équivalente au préfixe d'une autre selon comp ), retourne l'ordre entre les longueurs des deux plages.
2) Équivalent à return std :: lexicographical_compare_three_way (
first1, last1, first2, last2, std:: compare_three_way ( ) ) ;

Si le type de retour n'est pas l'un des trois types de catégories de comparaison, le programme est mal formé :

Table des matières

Paramètres

first1, last1 - la paire d'itérateurs définissant le premier intervalle d'éléments à examiner
first2, last2 - la paire d'itérateurs définissant le deuxième intervalle d'éléments à examiner
comp - un objet fonction
Exigences de type
-
InputIt1, InputIt2 doivent satisfaire aux exigences de LegacyInputIterator .

Valeur de retour

La valeur d'un type de catégorie de comparaison spécifié ci-dessus.

Complexité

Soit N 1 défini comme std:: distance ( first1, last1 ) et N 2 défini comme std:: distance ( first2, last2 ) :

1) Au maximum min( 1 ,N 2 ) applications de comp .
2) Au plus min(N 1 ,N 2 ) applications de std:: compare_three_way ( ) .

Implémentation possible

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>>,
                  "Le type de retour doit être un type de catégorie de comparaison.");
    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;
}

Exemple

#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) << " est ";
    std::is_lt(o) ? std::cout << "inférieur à ":
    std::is_gt(o) ? std::cout << "supérieur à ":
                    std::cout << "égal à ";
    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);
    }
}

Sortie :

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

Rapports de défauts

Les rapports de défauts modifiant le comportement suivants ont été appliqués rétroactivement aux normes C++ précédemment publiées.

DR Appliqué à Comportement publié Comportement corrigé
LWG 3410 C++20 des comparaisons superflues entre itérateurs étaient requises cette exigence a été supprimée

Voir aussi

renvoie true si une plage est lexicographiquement inférieure à une autre
(modèle de fonction)
objet fonction contraint implémentant x <=> y
(classe)
renvoie true si une plage est lexicographiquement inférieure à une autre
(objet fonction algorithme)