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) |
int compare( size_type pos1, size_type count1,
const basic_string& str,
size_type pos2, size_type count2 ) const;
|
(3) | (bis C++14) |
int compare( size_type pos1, size_type count1,
const basic_string& str,
size_type pos2, size_type count2 = npos ) const;
|
(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(/* see below */);
|
(7) | (seit C++17) (constexpr seit C++20) |
template< class StringViewLike >
int compare( size_type pos1, size_type count1,
const StringViewLike& t ) const;
|
(8) | (seit C++17) (constexpr seit C++20) |
template< class StringViewLike >
int compare( size_type pos1, size_type count1,
const StringViewLike& t,
size_type pos2, size_type count2 = npos) const;
|
(9) | (seit C++17) (constexpr seit C++20) |
Vergleicht zwei Zeichensequenzen.
str.[pos1, pos1 + count1) Teilzeichenkette dieses Strings mit str.
- Falls
count1 > size() - pos1, ist die Teilzeichenkette[pos1,size()).
[pos1, pos1 + count1) Teilzeichenkette dieses Strings mit einer Teilzeichenkette [pos2, pos2 + count2) von str.
- Falls
count1 > size() - pos1, ist die erste Teilzeichenkette[pos1,size()). - Falls
count2 > str.size() - pos2, ist die zweite Teilzeichenkette[pos2,str.size()).
s referenzierten Zeichen beginnt und Länge Traits::length(s) hat.[pos1, pos1 + count1) Teilzeichenkette dieses Strings mit der nullterminierten Zeichensequenz, die bei dem von s referenzierten Zeichen beginnt und Länge Traits::length(s) hat.
- Falls
count1 > size() - pos1, ist die Teilzeichenkette[pos1,size()).
[pos1, pos1 + count1) Teilzeichenkette dieses Strings mit den Zeichen im Bereich [s, s + count2). Die Zeichen in [s, s + count2) können Nullzeichen enthalten.
- Falls
count1 > size() - pos1, ist die Teilzeichenkette[pos1,size()).
t implizit in eine String-Ansicht sv wie durch std::basic_string_view<CharT, Traits> sv = t;, dann sv;[pos1, pos1 + count1) Teilzeichenkette dieses Strings mit sv, wie durch std::basic_string_view<CharT, Traits>(*this).substr(pos1, count1).compare(sv);[pos1, pos1 + count1) Teilzeichenkette dieses Strings mit einer Teilzeichenkette [pos2, pos2 + count2) von sv, wie durch std::basic_string_view<CharT, Traits>(*this).substr(pos1, count1).compare(sv.substr(pos2, count2)).std::is_convertible_v<const StringViewLike&,std::basic_string_view<CharT, Traits>> true und std::is_convertible_v<const StringViewLike&, const CharT*> false ist..Eine Zeichensequenz bestehend aus count1 Zeichen beginnend bei data1 wird mit einer Zeichensequenz bestehend aus count2 Zeichen beginnend bei data2 wie folgt verglichen:
- Berechne zuerst die Anzahl der zu vergleichenden Zeichen, wie durch
size_type rlen = std::min(count1, count2). - Vergleiche dann die Sequenzen durch Aufruf von
Traits::compare(data1, data2, rlen). Für Standard-Strings führt diese Funktion einen zeichenweisen lexikografischen Vergleich durch. Wenn das Ergebnis Null ist (die Zeichensequenzen sind bisher 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 zu data2 | 0
| |
| size1 > size2 | data1 ist größer als data2 | >0
| |
Traits::compare(data1, data2, rlen) > 0
|
data1 ist größer als data2 | >0
| |
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 lexikografisch (Funktionsschablone) |
| gibt eine Teilzeichenkette zurück (öffentliche Elementfunktion) | |
| definiert lexikografischen Vergleich und Hashing von Zeichenketten (Klassenschablone) | |
| vergleicht zwei Zeichenketten entsprechend der aktuellen Gebietsschemaeinstellung (Funktion) | |
| vergleicht zwei Bereiche lexikografisch (Funktionsschablone & Algorithmus-Funktionsobjekt) | |
| vergleicht zwei Ansichten (öffentliche Elementfunktion von std::basic_string_view<CharT,Traits>)
|