std:: lexicographical_compare
|
Definiert in Header
<algorithm>
|
||
|
template
<
class
InputIt1,
class
InputIt2
>
bool
lexicographical_compare
(
InputIt1 first1, InputIt1 last1,
|
(1) | (constexpr seit C++20) |
|
template
<
class
ExecutionPolicy,
class
ForwardIt1,
class
ForwardIt2
>
|
(2) | (seit C++17) |
|
template
<
class
InputIt1,
class
InputIt2,
class
Compare
>
bool
lexicographical_compare
(
InputIt1 first1, InputIt1 last1,
|
(3) | (constexpr seit C++20) |
|
template
<
class
ExecutionPolicy,
class
ForwardIt1,
class
ForwardIt2,
class
Compare
>
|
(4) | (seit C++17) |
Überprüft, ob der erste Bereich
[
first1
,
last1
)
lexikographisch
kleiner
ist als der zweite Bereich
[
first2
,
last2
)
.
|
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 ein Vorgang mit den folgenden Eigenschaften:
- Zwei Bereiche werden Element für Element verglichen.
- Das erste nicht übereinstimmende Element definiert, welcher Bereich lexikographisch kleiner oder größer als der andere ist.
- 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 dieselbe Länge besitzen, dann sind die Bereiche lexikographisch gleich .
- Ein leerer Bereich ist lexikographisch kleiner als jeder nicht-leere Bereich.
- Zwei leere Bereiche sind lexikographisch gleich .
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 |
| 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 äquivalent zu Folgendem sein: bool cmp ( const Type1 & a, const Type2 & b ) ;
Obwohl die Signatur nicht
const
&
benötigt, darf die Funktion die übergebenen Objekte nicht modifizieren und muss alle Werte der Typen (möglicherweise const)
|
| Typanforderungen | ||
-
InputIt1, InputIt2
müssen die Anforderungen von
LegacyInputIterator
erfüllen.
|
||
-
ForwardIt1, ForwardIt2
müssen die Anforderungen von
LegacyForwardIterator
erfüllen.
|
||
-
Compare
müssen die Anforderungen von
Compare
erfüllen.
|
||
Rückgabewert
true wenn der erste Bereich lexikographisch kleiner als der zweite ist, andernfalls false .
Komplexität
Gegeben N 1 als std:: distance ( first1, last1 ) und N 2 als std:: distance ( first2, last2 ) :
Exceptions
Die Überladungen mit einem Template-Parameter namens
ExecutionPolicy
melden Fehler wie folgt:
-
Wenn die Ausführung einer als Teil des Algorithmus aufgerufenen Funktion eine Exception wirft und
ExecutionPolicyeiner der Standard-Policies ist, wird std::terminate aufgerufen. Für jeden anderenExecutionPolicyist das Verhalten implementierungsdefiniert. - Wenn der Algorithmus keinen Speicher allozieren kann, wird std::bad_alloc geworfen.
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
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 142 | C++98 |
höchstens
min(N
1
,N
2
)
Vergleiche waren erlaubt, aber das
ist nicht möglich (Äquivalenz wird durch 2 Vergleiche bestimmt) |
verdoppelte das Limit |
| LWG 1205 | C++98 | die Ergebnisse lexikografischer Vergleiche mit leeren Bereichen waren unklar | klargestellt |
Siehe auch
|
bestimmt, ob zwei Elementgruppen identisch sind
(Funktions-Template) |
|
|
vergleicht zwei Bereiche mittels 3-Wege-Vergleich
(Funktions-Template) |
|
|
(C++20)
|
gibt
true
zurück, falls ein Bereich lexikographisch kleiner als ein anderer ist
(Algorithmus-Funktionsobjekt) |