Namensräume
Varianten
Aktionen

std::lexicographical_compare

Von cppreference.com
< cpp‎ | algorithm
 
 
Algorithmenbibliothek
Beschränkte Algorithmen und Algorithmen für Bereiche (C++20)
Beschränkte Algorithmen, z.B. ranges::copy, ranges::sort, ...
Ausführungsrichtlinien (C++17)
Nicht-modifizierende Sequenzoperationen
Stapeloperationen
(C++17)
Suchoperationen
(C++11)                (C++11)(C++11)

Modifizierende Sequenzoperationen
Kopieroperationen
(C++11)
(C++11)
Tauschoperationen
Transformationsoperationen
Generierungsoperationen
Entfernungsoperationen
Ordnungsändernde Operationen
(bis C++17)(C++11)
(C++20)(C++20)
Stichprobenoperationen
(C++17)

Sortier- und verwandte Operationen
Partitionierungsoperationen
Sortieroperationen
Binäre Suchoperationen
(auf partitionierten Bereichen)
Mengenoperationen (auf sortierten Bereichen)
Zusammenführungsoperationen (auf sortierten Bereichen)
Heapoperationen
Minimum/Maximum-Operationen
(C++11)
(C++17)
Lexikographische Vergleichsoperationen
lexicographical_compare
Permutationsoperationen
C-Bibliothek
Numerische Operationen
Operationen auf uninitialisiertem Speicher
 
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 [first1last1) lexikographisch kleiner ist als der zweite Bereich [first2last2).

1) Elemente werden mittels operator< verglichen.
3) Elemente werden mit der gegebenen binären Vergleichsfunktion comp verglichen.
2,4) Gleich wie (1,3), aber gemäß policy ausgeführt. Diese Überladungen nehmen nur an der Überladungsauflösung teil, wenn alle folgenden Bedingungen erfüllt sind.

std::is_execution_policy_v<std::decay_t<ExecutionPolicy>> ist true.

(bis C++20)

std::is_execution_policy_v<std::remove_cvref_t<ExecutionPolicy>> ist true.

(seit C++20)

Lexikographischer Vergleich ist eine Operation mit den folgenden Eigenschaften:

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

Inhalt

[edit] 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 Ausführungsrichtlinie, die verwendet werden soll
comp - Ein Vergleichsfunktions-Objekt (d.h. ein Objekt, das die Anforderungen an Compare erfüllt), das true zurückgibt, wenn das erste Argument *weniger* als das zweite ist.

Die Signatur der Vergleichsfunktion sollte äquivalent zu Folgendem sein

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

Obwohl die Signatur nicht const& haben muss, darf die Funktion die übergebenen Objekte nicht modifizieren und muss alle Werte vom Typ (möglicherweise const) Type1 und Type2 unabhängig von der Wertkategorie akzeptieren (daher ist Type1& nicht erlaubt, und auch nicht Type1, es sei denn, für Type1 ist ein Move äquivalent zu einer Kopie(seit C++11)).
Die Typen Type1 und Type2 müssen so beschaffen sein, dass Objekte der Typen InputIt1 und InputIt2 dereferenziert und dann implizit in sowohl Type1 als auch Type2 konvertiert werden können.

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

[edit] Rückgabewert

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

[edit] 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) Aufrufe der Vergleichsfunktion comp.

[edit] Ausnahmen

Die Überladungen mit einem Template-Parameter namens ExecutionPolicy berichten Fehler wie folgt

  • Wenn die Ausführung einer Funktion, die als Teil des Algorithmus aufgerufen wird, eine Ausnahme auslöst und ExecutionPolicy eine der Standardrichtlinien ist, wird std::terminate aufgerufen. Für jede andere ExecutionPolicy ist das Verhalten implementierungsabhängig.
  • Wenn dem Algorithmus der Speicher zur Neuzuweisung fehlt, wird std::bad_alloc ausgelöst.

[edit] 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);
}

[edit] 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

[edit] Fehlerberichte

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

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

[edit] Siehe auch

Bestimmt, ob zwei Elementmengen gleich sind
(Funktionstempelat) [edit]
vergleicht zwei Bereiche mittels Drei-Wege-Vergleich
(Funktionsvorlage) [editieren]
gibt true zurück, wenn ein Bereich lexikographisch kleiner als ein anderer ist
(Algorithmus-Funktionsobjekt)[bearbeiten]