Namespaces
Variants

std::basic_string<CharT,Traits,Allocator>:: compare

From cppreference.net
std::basic_string
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,

size_type pos2, size_type count2 ) const ;
(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 ( /* siehe unten */ ) ;
(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 Zeichenfolgen.

1) Vergleicht diesen String mit str .
2) Vergleicht einen [ pos1 , pos1 + count1 ) Substring dieser Zeichenkette mit str .
  • Falls count1 > size ( ) - pos1 , ist der Substring [ pos1 , size ( ) ) .
3) Vergleicht einen [ 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 ( ) ) .
4) Vergleicht diese Zeichenkette mit der nullterminierten Zeichenfolge, die an dem von s gezeigten Zeichen beginnt, mit der Länge Traits :: length ( s ) .
5) Vergleicht einen [ 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 ( ) ) .
6) Vergleicht einen [ 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 ( ) ) .
7-9) Konvertiert implizit t zu einem String-View sv als ob durch std:: basic_string_view < CharT, Traits > sv = t ; , dann
7) vergleicht diesen String mit sv ;
8) vergleicht einen [ pos1 , pos1 + count1 ) Substring dieser Zeichenkette mit sv , als ob durch std:: basic_string_view < CharT, Traits > ( * this ) . substr ( pos1, count1 ) . compare ( sv ) ;
9) vergleicht einen [ 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 ) )
.
Diese Überladungen nehmen nur dann an der Überladungsauflösung teil, wenn std:: is_convertible_v < const StringViewLike & ,
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.

7)
noexcept Spezifikation:
noexcept ( std:: is_nothrow_convertible_v < const T & , std:: basic_string_view < CharT, Traits >> )
8,9) Wirft alles, was durch die Konvertierung zu std::basic_string_view geworfen wird.

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> )