Namespaces
Variants

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

Von de.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)
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.

1) Vergleicht diesen String mit str.
2) Vergleicht eine [pos1, pos1 + count1) Teilzeichenkette dieses Strings mit str.
  • Falls count1 > size() - pos1, ist die Teilzeichenkette [pos1, size()).
3) Vergleicht eine [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()).
4) Vergleicht diesen String mit der nullterminierten Zeichensequenz, die bei dem von s referenzierten Zeichen beginnt und Länge Traits::length(s) hat.
5) Vergleicht eine [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()).
6) Vergleicht eine [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()).
7-9) Konvertiert t implizit in eine String-Ansicht sv wie durch std::basic_string_view<CharT, Traits> sv = t;, dann
7) vergleicht diesen String mit sv;
8) vergleicht eine [pos1, pos1 + count1) Teilzeichenkette dieses Strings mit sv, wie durch std::basic_string_view<CharT, Traits>(*this).substr(pos1, count1).compare(sv);
9) vergleicht eine [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))
.
Diese Überladungen nehmen nur an der Überladungsauflösung teil, wenn 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.

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