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 Zeichensequenzen.
[pos1, pos1 + count1) mit str.- Wenn count1 > size() - pos1, ist der Teilstring
[pos1,size()).
[pos1, pos1 + count1) mit einem Teilstring von str [pos2, pos2 + count2).- Wenn count1 > size() - pos1, ist der erste Teilstring
[pos1,size()). - Wenn count2 > str.size() - pos2, ist der zweite Teilstring
[pos2,str.size()).
[pos1, pos1 + count1) mit der nullterminierten Zeichensequenz, die am durch s zeigenden Zeichen beginnt und die Länge Traits::length(s) hat.- Wenn count1 > size() - pos1, ist der Teilstring
[pos1,size()).
[pos1, pos1 + count1) mit den Zeichen im Bereich [s, s + count2). Die Zeichen in [s, s + count2) können Nullzeichen enthalten.- Wenn count1 > size() - pos1, ist der Teilstring
[pos1,size()).
[pos1, pos1 + count1) mit sv, als ob durch std::basic_string_view<CharT, Traits>(*this).substr(pos1, count1).compare(sv);[pos1, pos1 + count1) mit einem Teilstring von sv [pos2, pos2 + count2), 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 Zeichensequenz bestehend aus count1 Zeichen, beginnend bei data1, wird mit einer Zeichensequenz, bestehend aus count2 Zeichen, beginnend bei data2, wie folgt verglichen:
- Zuerst wird die Anzahl der zu vergleichenden Zeichen berechnet, als ob 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 bisher gleich), 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 | |
Inhalt |
[edit] Parameter
| str | - | anderer String zum Vergleichen |
| s | - | Zeiger auf die zu vergleichende Zeichenkette |
| count1 | - | Anzahl der Zeichen dieses Strings zum Vergleichen |
| pos1 | - | Position des ersten Zeichens in diesem String zum Vergleichen |
| count2 | - | Anzahl der Zeichen des gegebenen Strings zum Vergleichen |
| pos2 | - | Position des ersten Zeichens des gegebenen Strings zum Vergleichen |
| t | - | Objekt (konvertierbar zu std::basic_string_view), das verglichen werden soll |
[edit] Rückgabewert
- Negativer Wert, wenn *this in lexikographischer Reihenfolge vor der durch die Argumente spezifizierten Zeichensequenz steht.
- Null, wenn beide Zeichensequenzen als äquivalent verglichen werden.
- Positiver Wert, wenn *this in lexikographischer Reihenfolge nach der durch die Argumente spezifizierten Zeichensequenz steht.
[edit] Ausnahmen
Die Überladungen, die Parameter namens pos1 oder pos2 verwenden, werfen std::out_of_range, wenn das Argument außerhalb des gültigen Bereichs liegt.
Wenn aus irgendeinem Grund eine Ausnahme ausgelöst wird, hat diese Funktion keine Auswirkungen (starkes Ausnahmesicherheitsgarantie).
[edit] 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; } |
[edit] Anmerkungen
Für Situationen, in denen kein Drei-Wege-Vergleich erforderlich ist, bietet std::basic_string die üblichen Vergleichsoperatoren (<, <=, ==, >, etc.).
Standardmäßig (mit den Standard-`std::char_traits`) ist diese Funktion nicht sprachabhängig. Sehen Sie std::collate::compare für sprachabhängige Drei-Wege-String-Vergleiche.
[edit] 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) << " comes before " << std::quoted(str2) << ".\n"; else if (compare_result > 0) std::cout << std::quoted(str2) << " comes before " << std::quoted(str1) << ".\n"; else std::cout << std::quoted(str1) << " and " << std::quoted(str2) << " are the same.\n"; } int main() { std::string batman{"Batman"}; std::string superman{"Superman"}; int compare_result{0}; // 1) Compare with other string compare_result = batman.compare(superman); std::cout << "1) "; print_compare_result("Batman", "Superman", compare_result); // 2) Compare substring with other string compare_result = batman.compare(3, 3, superman); std::cout << "2) "; print_compare_result("man", "Superman", compare_result); // 3) Compare substring with other substring compare_result = batman.compare(3, 3, superman, 5, 3); std::cout << "3) "; print_compare_result("man", "man", compare_result); // Compare substring with other substring // defaulting to end of other string assert(compare_result == batman.compare(3, 3, superman, 5)); // 4) Compare with char pointer compare_result = batman.compare("Superman"); std::cout << "4) "; print_compare_result("Batman", "Superman", compare_result); // 5) Compare substring with char pointer compare_result = batman.compare(3, 3, "Superman"); std::cout << "5) "; print_compare_result("man", "Superman", compare_result); // 6) Compare substring with char pointer substring compare_result = batman.compare(0, 3, "Superman", 5); std::cout << "6) "; print_compare_result("Bat", "Super", compare_result); }
Ausgabe
1) "Batman" comes before "Superman". 2) "Superman" comes before "man". 3) "man" and "man" are the same. 4) "Batman" comes before "Superman". 5) "Superman" comes before "man". 6) "Bat" comes before "Super".
[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 5 | C++98 | Der Parameter count2 der Überladung (6) hatte ein Standardargument npos |
Standardargument entfernt, aufgeteilt in die Ü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 die Erstellung als Template |
| P1148R0 | C++17 | noexcept für Überladung (7) wurde versehentlich durch die Auflösung von LWG2946 entfernt |
wiederhergestellt |
[edit] 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 Strings lexikographisch (function template) |
| gibt eine Teilzeichenkette zurück (public member function) | |
| definiert lexikographische Vergleiche und Hashing von Zeichenketten (Klassentemplate) | |
| vergleicht zwei Strings gemäß der aktuellen Locale (Funktion) | |
| gibt true zurück, wenn ein Bereich lexikographisch kleiner als ein anderer ist (Funktionsvorlage) | |
| vergleicht zwei Ansichten (member function of std::basic_string_view<CharT,Traits>) |