std::basic_string<CharT,Traits,Allocator>:: compare
|
int
compare
(
const
basic_string
&
str
)
const
;
|
(1) |
(noexcept seit C++11)
(constexpr seit C++20) |
|
int
compare
(
size_type pos1, size_type count1,
const basic_string & str ) const ; |
(2) | (constexpr seit C++20) |
| (3) | ||
|
int
compare
(
size_type pos1, size_type count1,
const
basic_string
&
str,
|
(bis C++14) | |
|
int
compare
(
size_type pos1, size_type count1,
const
basic_string
&
str,
|
(seit C++14)
(constexpr seit C++20) |
|
|
int
compare
(
const
CharT
*
s
)
const
;
|
(4) | (constexpr seit C++20) |
|
int
compare
(
size_type pos1, size_type count1,
const CharT * s ) const ; |
(5) | (constexpr seit C++20) |
|
int
compare
(
size_type pos1, size_type count1,
const CharT * s, size_type count2 ) const ; |
(6) | (constexpr seit C++20) |
|
template
<
class
StringViewLike
>
int compare ( const StringViewLike & t ) const noexcept ( /* siehe unten */ ) ; |
(7) |
(seit C++17)
(constexpr seit C++20) |
|
template
<
class
StringViewLike
>
int
compare
(
size_type pos1, size_type count1,
|
(8) |
(seit C++17)
(constexpr seit C++20) |
|
template
<
class
StringViewLike
>
int
compare
(
size_type pos1, size_type count1,
|
(9) |
(seit C++17)
(constexpr seit C++20) |
Vergleicht zwei Zeichenfolgen.
[
pos1
,
pos1
+
count1
)
Substring dieser Zeichenkette mit
str
.
-
Falls
count1
>
size
(
)
-
pos1
, ist der Substring
[pos1,size ( )).
[
pos1
,
pos1
+
count1
)
Substring dieser Zeichenkette mit einem Substring
[
pos2
,
pos2
+
count2
)
von
str
.
-
Falls
count1
>
size
(
)
-
pos1
, ist der erste Substring
[pos1,size ( )). -
Falls
count2
>
str.
size
(
)
-
pos2
, ist der zweite Substring
[pos2,str. size ( )).
[
pos1
,
pos1
+
count1
)
Substring dieser Zeichenkette mit der nullterminierten Zeichenfolge beginnend bei dem Zeichen, auf das
s
zeigt, mit der Länge
Traits
::
length
(
s
)
.
-
Falls
count1
>
size
(
)
-
pos1
, ist der Substring
[pos1,size ( )).
[
pos1
,
pos1
+
count1
)
Substring dieser Zeichenkette mit den Zeichen im Bereich
[
s
,
s
+
count2
)
. Die Zeichen in
[
s
,
s
+
count2
)
können Nullzeichen enthalten.
-
Falls
count1
>
size
(
)
-
pos1
, ist der Substring
[pos1,size ( )).
[
pos1
,
pos1
+
count1
)
Substring dieser Zeichenkette mit
sv
, als ob durch
std::
basic_string_view
<
CharT, Traits
>
(
*
this
)
.
substr
(
pos1, count1
)
.
compare
(
sv
)
;
[
pos1
,
pos1
+
count1
)
Substring dieser Zeichenkette mit einem Substring
[
pos2
,
pos2
+
count2
)
von
sv
, als ob durch
std::
basic_string_view
<
CharT, Traits
>
(
*
this
)
. substr ( pos1, count1 ) . compare ( sv. substr ( pos2, count2 ) ) .
std:: basic_string_view < CharT, Traits >> true ist und std:: is_convertible_v < const StringViewLike & , const CharT * > false ist.
Eine Zeichenfolge bestehend aus count1 Zeichen beginnend bei data1 wird verglichen mit einer Zeichenfolge bestehend aus count2 Zeichen beginnend bei data2 wie folgt:
- Zuerst wird die Anzahl der zu vergleichenden Zeichen berechnet, wie durch size_type rlen = std:: min ( count1, count2 ) .
- Dann werden die Sequenzen durch Aufruf von Traits :: compare ( data1, data2, rlen ) verglichen. Für Standard-Strings führt diese Funktion einen zeichenweisen lexikographischen Vergleich durch. Wenn das Ergebnis null ist (die Zeichensequenzen sind bis dahin gleich), dann werden ihre Größen wie folgt verglichen:
| Bedingung | Ergebnis | Rückgabewert | |
|---|---|---|---|
Traits::compare(
data1
,
data2
,
rlen
) < 0
|
data1 ist kleiner als data2 | < 0 | |
Traits::compare(
data1
,
data2
,
rlen
) == 0
|
size1 < size2 | data1 ist kleiner als data2 | < 0 |
| size1 == size2 | data1 ist gleich data2 | 0 | |
| size1 > size2 | data1 ist größer als data2 | > 0 | |
Traits::compare(
data1
,
data2
,
rlen
) > 0
|
data1 ist größer als data2 | > 0 | |
Inhaltsverzeichnis |
Parameter
| str | - | andere Zeichenkette zum Vergleich |
| s | - | Zeiger auf die zu vergleichende Zeichenkette |
| count1 | - | Anzahl der zu vergleichenden Zeichen dieser Zeichenkette |
| pos1 | - | Position des ersten zu vergleichenden Zeichens in dieser Zeichenkette |
| count2 | - | Anzahl der zu vergleichenden Zeichen der angegebenen Zeichenkette |
| pos2 | - | Position des ersten zu vergleichenden Zeichens der angegebenen Zeichenkette |
| t | - | Objekt (konvertierbar zu std::basic_string_view ) zum Vergleich |
Rückgabewert
- Negativer Wert, wenn * this vor der durch die Argumente spezifizierten Zeichensequenz erscheint, in lexikographischer Reihenfolge.
- Null, wenn beide Zeichensequenzen äquivalent vergleichen.
- Positiver Wert, wenn * this nach der durch die Argumente spezifizierten Zeichensequenz erscheint, in lexikographischer Reihenfolge.
Ausnahmen
Die Überladungen, die Parameter mit den Namen pos1 oder pos2 verwenden, werfen std::out_of_range , wenn das Argument außerhalb des gültigen Bereichs liegt.
Wenn aus irgendeinem Grund eine Exception ausgelöst wird, hat diese Funktion keine Wirkung ( strong exception safety guarantee ).
Mögliche Implementierung
| Überladung (1) |
|---|
template<class CharT, class Traits, class Alloc> int std::basic_string<CharT, Traits, Alloc>::compare (const std::basic_string& s) const noexcept { size_type lhs_sz = size(); size_type rhs_sz = s.size(); int result = traits_type::compare(data(), s.data(), std::min(lhs_sz, rhs_sz)); if (result != 0) return result; if (lhs_sz < rhs_sz) return -1; if (lhs_sz > rhs_sz) return 1; return 0; } |
Hinweise
Für Situationen, in denen kein Drei-Wege-Vergleich erforderlich ist,
std::basic_string
bietet die üblichen
relationalen Operatoren
(
<
,
<=
,
==
,
>
, etc).
Standardmäßig (mit den Standard- std::char_traits ) ist diese Funktion nicht lokalisierungsabhängig. Siehe std::collate::compare für eine lokalisierungsbewusste Drei-Wege-Zeichenkettenvergleich.
Beispiel
#include <cassert> #include <iomanip> #include <iostream> #include <string> #include <string_view> void print_compare_result(std::string_view str1, std::string_view str2, int compare_result) { if (compare_result < 0) std::cout << std::quoted(str1) << " kommt vor " << std::quoted(str2) << ".\n"; else if (compare_result > 0) std::cout << std::quoted(str2) << " kommt vor " << std::quoted(str1) << ".\n"; else std::cout << std::quoted(str1) << " und " << std::quoted(str2) << " sind gleich.\n"; } int main() { std::string batman{"Batman"}; std::string superman{"Superman"}; int compare_result{0}; // 1) Vergleich mit anderem String compare_result = batman.compare(superman); std::cout << "1) "; print_compare_result("Batman", "Superman", compare_result); // 2) Vergleich von Teilstring mit anderem String compare_result = batman.compare(3, 3, superman); std::cout << "2) "; print_compare_result("man", "Superman", compare_result); // 3) Vergleich von Teilstring mit anderem Teilstring compare_result = batman.compare(3, 3, superman, 5, 3); std::cout << "3) "; print_compare_result("man", "man", compare_result); // Vergleich von Teilstring mit anderem Teilstring // Standardmäßig bis zum Ende des anderen Strings assert(compare_result == batman.compare(3, 3, superman, 5)); // 4) Vergleich mit char-Zeiger compare_result = batman.compare("Superman"); std::cout << "4) "; print_compare_result("Batman", "Superman", compare_result); // 5) Vergleich von Teilstring mit char-Zeiger compare_result = batman.compare(3, 3, "Superman"); std::cout << "5) "; print_compare_result("man", "Superman", compare_result); // 6) Vergleich von Teilstring mit Teilstring eines char-Zeigers compare_result = batman.compare(0, 3, "Superman", 5); std::cout << "6) "; print_compare_result("Bat", "Super", compare_result); }
Ausgabe:
1) "Batman" kommt vor "Superman". 2) "Superman" kommt vor "man". 3) "man" und "man" sind gleich. 4) "Batman" kommt vor "Superman". 5) "Superman" kommt vor "man". 6) "Bat" kommt vor "Super".
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 5 | C++98 |
der Parameter
count2
der Überladung
(6)
hatte ein Standardargument npos |
Standardargument entfernt,
aufgeteilt in Überladungen (5) und (6) |
| LWG 847 | C++98 | es gab keine Ausnahmesicherheitsgarantie | starke Ausnahmesicherheitsgarantie hinzugefügt |
| LWG 2946 | C++17 | Überladung (7) verursachte in einigen Fällen Mehrdeutigkeit | vermieden durch Template-Implementierung |
| P1148R0 | C++17 |
noexcept für Überladung
(7)
wurde versehentlich
durch die Lösung von LWG2946 entfernt |
wiederhergestellt |
Siehe auch
|
(entfernt in C++20)
(entfernt in C++20)
(entfernt in C++20)
(entfernt in C++20)
(entfernt in C++20)
(C++20)
|
vergleicht zwei Zeichenketten lexikographisch
(Funktions-Template) |
|
gibt einen Teilstring zurück
(öffentliche Elementfunktion) |
|
|
definiert lexikographischen Vergleich und Hashbildung von Zeichenketten
(Klassen-Template) |
|
|
vergleicht zwei Zeichenketten gemäß der aktuellen Locale
(Funktion) |
|
|
gibt
true
zurück, wenn ein Bereich lexikographisch kleiner als ein anderer ist
(Funktions-Template) |
|
|
vergleicht zwei Views
(öffentliche Elementfunktion von
std::basic_string_view<CharT,Traits>
)
|