Namespaces
Variants

std::lexicographical_compare

Von de.cppreference.net
 
 
Algorithmenbibliothek
Eingeschränkte Algorithmen und Algorithmen auf Bereichen (C++20)
Eingeschränkte Algorithmen, z. B. ranges::copy, ranges::sort, ...
Nicht modifizierende Sequenzoperationen    
Batch-Operationen
(C++17)
Suchoperationen
Modifizierende Sequenzoperationen
Kopieroperationen
(C++11)
(C++11)
Tauschoperationen
Transformationsoperationen
Erzeugungsoperationen
Entfernungsoperationen
Reihenfolgeändernde Operationen
(bis C++17)(C++11)
(C++20)(C++20)
Stichprobenoperationen
(C++17)

Sortier- und verwandte Operationen
Partitionierungsoperationen
(C++11)    

Sortieroperationen
Binäre Suchoperationen
(auf partitionierten Bereichen)
Mengenoperationen (auf sortierten Bereichen)
Mischoperationen (auf sortierten Bereichen)
Heap-Operationen
Minimum/Maximum-Operationen
(C++11)
(C++17)
Lexikografische Vergleichsoperationen
Permutationsoperationen


 
Definiert in Header <algorithm>
template< class InputIt1, class InputIt2 >
bool lexicographical_compare( InputIt1 first1, InputIt1 last1,
                              InputIt2 first2, InputIt2 last2 );
(1) (constexpr seit C++20)
template< class ExecutionPolicy,
          class ForwardIt1, class ForwardIt2 >
bool lexicographical_compare( ExecutionPolicy&& policy,
                              ForwardIt1 first1, ForwardIt1 last1,
                              ForwardIt2 first2, ForwardIt2 last2 );
(2) (seit C++17)
template< class InputIt1, class InputIt2, class Compare >
bool lexicographical_compare( InputIt1 first1, InputIt1 last1,
                              InputIt2 first2, InputIt2 last2,
                              Compare comp );
(3) (constexpr seit C++20)
template< class ExecutionPolicy,
          class ForwardIt1, class ForwardIt2, class Compare >
bool lexicographical_compare( ExecutionPolicy&& policy,
                              ForwardIt1 first1, ForwardIt1 last1,
                              ForwardIt2 first2, ForwardIt2 last2,
                              Compare comp );
(4) (seit C++17)

Prüft, ob der erste Bereich [first1, last1) lexikografisch kleiner als der zweite Bereich [first2, last2) ist.

1) Die Elemente werden mit operator< verglichen.
3) Die Elemente werden mit der gegebenen binären Vergleichsfunktion comp verglichen.
2,4) Wie (1,3), jedoch gemäß policy ausgeführt. Diese Überladungen nehmen nur an der Überladungsauflösung teil, wenn der Wert des folgenden Ausdrucks true ist:

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

(bis C++20)

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

(seit C++20)

Lexikografischer Vergleich ist eine Operation mit den folgenden Eigenschaften:

  • Zwei Bereiche werden elementweise verglichen.
  • Das erste nicht übereinstimmende Element bestimmt, welcher Bereich lexikografisch kleiner oder größer als der andere ist.
  • Wenn ein Bereich ein Präfix eines anderen ist, ist der kürzere Bereich lexikografisch kleiner als der andere.
  • Wenn zwei Bereiche äquivalente Elemente haben und gleich lang sind, sind die Bereiche lexikografisch gleich.
  • Ein leerer Bereich ist lexikografisch kleiner als jeder nicht-leere Bereich.
  • Zwei leere Bereiche sind lexikografisch gleich.

Parameter

first1, last1 - das Iteratorenpaar, das den ersten Bereich der zu untersuchenden Elemente definiert
first2, last2 - das Iteratorenpaar, das den zweiten Bereich der zu untersuchenden Elemente definiert
policy - die zu verwendende Ausführungsrichtlinie
comp - Vergleichsfunktionsobjekt (d. h. ein Objekt, das die Anforderungen von Compare erfüllt), das true zurückgibt, wenn das erste Argument kleiner als das zweite ist.

Die Signatur der Vergleichsfunktion sollte wie folgt sein:

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

Obwohl die Signatur nicht const& haben muss, darf die Funktion die ihr übergebenen Objekte nicht verändern und muss in der Lage sein, alle Werte des Typs (möglicherweise const) Type1 und Type2 unabhängig von der Wertkategorie zu akzeptieren (daher ist Type1& nicht erlaubt, ebenso wenig wie Type1 es sei denn, für Type1 ist eine Verschiebung gleichbedeutend mit einer Kopie(seit C++11)).
Die Typen Type1 und Type2 müssen so sein, dass Objekte der Typen InputIt1 und InputIt2 dereferenziert und dann implizit in beide Type1 und Type2 konvertiert werden können.

Typanforderungen
-
InputIt1, InputIt2 muss die Anforderungen von LegacyInputIterator erfüllen.
-
ForwardIt1, ForwardIt2 muss die Anforderungen von LegacyForwardIterator erfüllen.
-
Compare muss die Anforderungen von Compare erfüllen.

Rückgabewert

true, wenn der erste Bereich lexikografisch kleiner als der zweite ist, andernfalls false.

Komplexität

Gegeben N1 als std::distance(first1, last1) und N2 als std::distance(first2, last2):

1,2) Höchstens 2min(1,N2) Vergleiche mit operator<.
3,4) Höchstens 2min(N1,N2) Anwendungen der Vergleichsfunktion comp.

Ausnahmen

Die Überladungen mit einem Vorlagenparameter namens ExecutionPolicy melden Fehler wie folgt:

  • Wenn die Ausführung einer im Rahmen des Algorithmus aufgerufenen Funktion eine Ausnahme auslöst und ExecutionPolicy eine der Standardrichtlinien ist, wird std::terminate aufgerufen. Für jede andere ExecutionPolicy ist das Verhalten implementierungsdefiniert.
  • Wenn der Algorithmus keinen Speicher zuweisen kann, wird std::bad_alloc ausgelöst.

Mögliche Implementierung

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

Beispiel

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

Mögliche Ausgabe:

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

Fehlerberichte (Defect Reports)

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

DR Angewendet auf Verhalten wie veröffentlicht Richtiges Verhalten
LWG 142 C++98 höchstens min(N1,N2) Vergleiche waren erlaubt, aber das
ist nicht möglich (Äquivalenz wird durch 2 Vergleiche bestimmt)
verdoppelte die Grenze
LWG 1205 C++98 Die Ergebnisse von lexikografischen Vergleichen mit leeren Bereichen waren unklar wurde klargestellt

Siehe auch

bestimmt, ob zwei Mengen von Elementen gleich sind
(Funktionsvorlage & Algorithmus-Funktionsobjekt)
vergleicht zwei Bereiche mit einem dreifachen Vergleich
(Funktionsvorlage)
vergleicht zwei Bereiche lexikografisch
(Algorithmus-Funktionsobjekt)