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
Definiert im Header <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) (seit C++20)
template < class InputIt1, class InputIt2 >

constexpr auto lexicographical_compare_three_way

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

Vergleicht zwei Bereiche lexikographisch [ first1 , last1 ) und [ first2 , last2 ) mittels Drei-Wege-Vergleich und erzeugt ein Ergebnis des stärksten anwendbaren Vergleichskategorientyps.

1) Gibt die Reihenfolge zwischen dem ersten nicht-äquivalenten Elementpaar gemäß comp in beiden Bereichen zurück, falls vorhanden, andernfalls (wenn ein Bereich gemäß comp einem Präfix eines anderen Bereichs entspricht) gibt die Reihenfolge zwischen der Länge beider Bereiche zurück.
2) Entspricht return std :: lexicographical_compare_three_way (
first1, last1, first2, last2, std:: compare_three_way ( ) ) ;

Wenn der Rückgabetyp nicht einer der drei Vergleichskategorien-Typen ist, ist das Programm fehlerhaft:

Inhaltsverzeichnis

Parameter

first1, last1 - das Paar von Iteratoren, das den ersten Bereich der zu untersuchenden Elemente definiert
first2, last2 - das Paar von Iteratoren, das den zweiten Bereich der zu untersuchenden Elemente definiert
comp - ein Funktionsobjekt
Typanforderungen
-
InputIt1, InputIt2 müssen die Anforderungen von LegacyInputIterator erfüllen.

Rückgabewert

Der Wert eines Vergleichskategorietyps, wie oben angegeben.

Komplexität

Gegeben N 1 als std:: distance ( first1, last1 ) und N 2 als std:: distance ( first2, last2 ) :

1) Höchstens min( 1 ,N 2 ) Anwendungen von comp .
2) Höchstens min(N 1 ,N 2 ) Anwendungen von std:: compare_three_way ( ) .

Mögliche Implementierung

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>>,
                  "Der Rückgabetyp muss ein Vergleichskategorietyp sein.");
    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;
}

Beispiel

#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);
    }
}

Ausgabe:

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

Fehlerberichte

Die folgenden verhaltensändernden Fehlerberichte wurden rückwirkend auf zuvor veröffentlichte C++-Standards angewendet.

DR Angewendet auf Verhalten wie veröffentlicht Korrektes Verhalten
LWG 3410 C++20 überflüssige Vergleiche zwischen Iteratoren waren erforderlich diese Anforderung entfernt

Siehe auch

gibt true zurück, falls ein Bereich lexikographisch kleiner als ein anderer ist
(Funktions-Template)
eingeschränktes Funktionsobjekt, das x <=> y implementiert
(Klasse)
gibt true zurück, falls ein Bereich lexikographisch kleiner als ein anderer ist
(Algorithmus-Funktionsobjekt)