Namespaces
Variants

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

From cppreference.net
std::basic_string
int compare ( const basic_string & str ) const ;
(1) (noexcept depuis C++11)
(constexpr depuis C++20)
int compare ( size_type pos1, size_type count1,
const basic_string & str ) const ;
(2) (constexpr depuis C++20)
(3)
int compare ( size_type pos1, size_type count1,

const basic_string & str,

size_type pos2, size_type count2 ) const ;
(jusqu'à C++14)
int compare ( size_type pos1, size_type count1,

const basic_string & str,

size_type pos2, size_type count2 = npos ) const ;
(depuis C++14)
(constexpr depuis C++20)
int compare ( const CharT * s ) const ;
(4) (constexpr depuis C++20)
int compare ( size_type pos1, size_type count1,
const CharT * s ) const ;
(5) (constexpr depuis C++20)
int compare ( size_type pos1, size_type count1,
const CharT * s, size_type count2 ) const ;
(6) (constexpr depuis C++20)
template < class StringViewLike >
int compare ( const StringViewLike & t ) const noexcept ( /* voir ci-dessous */ ) ;
(7) (depuis C++17)
(constexpr depuis C++20)
template < class StringViewLike >

int compare ( size_type pos1, size_type count1,

const StringViewLike & t ) const ;
(8) (depuis C++17)
(constexpr depuis 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) (depuis C++17)
(constexpr depuis C++20)

Compare deux séquences de caractères.

1) Compare cette chaîne à str .
2) Compare une sous-chaîne [ pos1 , pos1 + count1 ) de cette chaîne à str .
  • Si count1 > size ( ) - pos1 , la sous-chaîne est [ pos1 , size ( ) ) .
3) Compare une sous-chaîne [ pos1 , pos1 + count1 ) de cette chaîne à une sous-chaîne [ pos2 , pos2 + count2 ) de str .
  • Si count1 > size ( ) - pos1 , la première sous-chaîne est [ pos1 , size ( ) ) .
  • Si count2 > str. size ( ) - pos2 , la deuxième sous-chaîne est [ pos2 , str. size ( ) ) .
4) Compare cette chaîne à la séquence de caractères terminée par un caractère nul commençant au caractère pointé par s avec une longueur de Traits :: length ( s ) .
5) Compare une sous-chaîne [ pos1 , pos1 + count1 ) de cette chaîne à la séquence de caractères terminée par un caractère nul commençant au caractère pointé par s avec la longueur Traits :: length ( s ) .
  • Si count1 > size ( ) - pos1 , la sous-chaîne est [ pos1 , size ( ) ) .
6) Compare une sous-chaîne [ pos1 , pos1 + count1 ) de cette chaîne aux caractères dans la plage [ s , s + count2 ) . Les caractères dans [ s , s + count2 ) peuvent inclure des caractères nuls.
  • Si count1 > size ( ) - pos1 , la sous-chaîne est [ pos1 , size ( ) ) .
7-9) Convertit implicitement t en une vue de chaîne sv comme si par std:: basic_string_view < CharT, Traits > sv = t ; , puis
7) compare cette chaîne à sv ;
8) compare une sous-chaîne [ pos1 , pos1 + count1 ) de cette chaîne à sv , comme par std:: basic_string_view < CharT, Traits > ( * this ) . substr ( pos1, count1 ) . compare ( sv ) ;
9) compare une sous-chaîne [ pos1 , pos1 + count1 ) de cette chaîne à une sous-chaîne [ pos2 , pos2 + count2 ) de sv , comme par std:: basic_string_view < CharT, Traits > ( * this )
. substr ( pos1, count1 ) . compare ( sv. substr ( pos2, count2 ) )
.
Ces surcharges participent à la résolution de surcharge seulement si std:: is_convertible_v < const StringViewLike & ,
std:: basic_string_view < CharT, Traits >>
est true et std:: is_convertible_v < const StringViewLike & , const CharT * > est false .

Une séquence de caractères composée de count1 caractères commençant à data1 est comparée à une séquence de caractères composée de count2 caractères commençant à data2 comme suit :

  • D'abord, calculez le nombre de caractères à comparer, comme par size_type rlen = std:: min ( count1, count2 ) .
  • Ensuite, comparez les séquences en appelant Traits :: compare ( data1, data2, rlen ) . Pour les chaînes standard, cette fonction effectue une comparaison lexicographique caractère par caractère. Si le résultat est zéro (les séquences de caractères sont égales jusqu'à présent), alors leurs tailles sont comparées comme suit :
Condition Résultat Valeur de retour
Traits::compare( data1 , data2 , rlen ) < 0 data1 est inférieur à data2 < 0
Traits::compare( data1 , data2 , rlen ) == 0 size1 < size2 data1 est inférieur à data2 < 0
size1 == size2 data1 est égal à data2 0
size1 > size2 data1 est supérieur à data2 > 0
Traits::compare( data1 , data2 , rlen ) > 0 data1 est supérieur à data2 > 0

Table des matières

Paramètres

str - autre chaîne à comparer
s - pointeur vers la chaîne de caractères à comparer
count1 - nombre de caractères de cette chaîne à comparer
pos1 - position du premier caractère dans cette chaîne à comparer
count2 - nombre de caractères de la chaîne donnée à comparer
pos2 - position du premier caractère de la chaîne donnée à comparer
t - objet (convertible en std::basic_string_view ) à comparer

Valeur de retour

  • Valeur négative si * this apparaît avant la séquence de caractères spécifiée par les arguments, dans l'ordre lexicographique.
  • Zéro si les deux séquences de caractères sont équivalentes.
  • Valeur positive si * this apparaît après la séquence de caractères spécifiée par les arguments, dans l'ordre lexicographique.

Exceptions

Les surcharges prenant les paramètres nommés pos1 ou pos2 lancent std::out_of_range si l'argument est hors limites.

7)
noexcept spécification :
noexcept ( std:: is_nothrow_convertible_v < const T & , std:: basic_string_view < CharT, Traits >> )
8,9) Lance tout ce qui est lancé par la conversion en std::basic_string_view .

Si une exception est levée pour quelque raison que ce soit, cette fonction n'a aucun effet ( garantie forte de sûreté face aux exceptions ).

Implémentation possible

surcharge (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;
}

Notes

Pour les situations où une comparaison à trois voies n'est pas nécessaire, std::basic_string fournit les opérateurs relationnels habituels ( < , <= , == , > , etc.).

Par défaut (avec les std::char_traits par défaut), cette fonction n'est pas sensible aux paramètres régionaux. Voir std::collate::compare pour une comparaison de chaînes à trois voies prenant en compte les paramètres régionaux.

Exemple

#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) << " vient avant "
                  << std::quoted(str2) << ".\n";
    else if (compare_result > 0)
        std::cout << std::quoted(str2) << " vient avant "
                  << std::quoted(str1) << ".\n";
    else
        std::cout << std::quoted(str1) << " et "
                  << std::quoted(str2) << " sont identiques.\n";
}
int main()
{
    std::string batman{"Batman"};
    std::string superman{"Superman"};
    int compare_result{0};
    // 1) Comparaison avec une autre chaîne
    compare_result = batman.compare(superman);
    std::cout << "1) ";
    print_compare_result("Batman", "Superman", compare_result);
    // 2) Comparaison d'une sous-chaîne avec une autre chaîne
    compare_result = batman.compare(3, 3, superman);
    std::cout << "2) ";
    print_compare_result("man", "Superman", compare_result);
    // 3) Comparaison d'une sous-chaîne avec une autre sous-chaîne
    compare_result = batman.compare(3, 3, superman, 5, 3);
    std::cout << "3) ";
    print_compare_result("man", "man", compare_result);
    // Comparaison d'une sous-chaîne avec une autre sous-chaîne
    // par défaut jusqu'à la fin de l'autre chaîne
    assert(compare_result == batman.compare(3, 3, superman, 5));
    // 4) Comparaison avec un pointeur de caractères
    compare_result = batman.compare("Superman");
    std::cout << "4) ";
    print_compare_result("Batman", "Superman", compare_result);
    // 5) Comparaison d'une sous-chaîne avec un pointeur de caractères
    compare_result = batman.compare(3, 3, "Superman");
    std::cout << "5) ";
    print_compare_result("man", "Superman", compare_result);
    // 6) Comparaison d'une sous-chaîne avec une sous-chaîne de pointeur de caractères
    compare_result = batman.compare(0, 3, "Superman", 5);
    std::cout << "6) ";
    print_compare_result("Bat", "Super", compare_result);
}

Sortie :

1) "Batman" vient avant "Superman".
2) "Superman" vient avant "man".
3) "man" et "man" sont identiques.
4) "Batman" vient avant "Superman".
5) "Superman" vient avant "man".
6) "Bat" vient avant "Super".

Rapports de défauts

Les rapports de défauts modifiant le comportement suivants ont été appliqués rétroactivement aux normes C++ précédemment publiées.

DR Appliqué à Comportement publié Comportement corrigé
LWG 5 C++98 le paramètre count2 de la surcharge (6)
avait un argument par défaut npos
argument par défaut supprimé,
divisé en surcharges (5) et (6)
LWG 847 C++98 aucune garantie de sûreté des exceptions garantie de sûreté forte des exceptions ajoutée
LWG 2946 C++17 la surcharge (7) causait une ambiguïté dans certains cas évitée en la transformant en template
P1148R0 C++17 le spécificateur noexcept pour la surcharge (7) avait été
accidentellement supprimé par la résolution de LWG2946
restauré

Voir aussi

(supprimé en C++20) (supprimé en C++20) (supprimé en C++20) (supprimé en C++20) (supprimé en C++20) (C++20)
compare lexicographiquement deux chaînes
(modèle de fonction)
retourne une sous-chaîne
(fonction membre publique)
définit la comparaison lexicographique et le hachage des chaînes
(modèle de classe)
compare deux chaînes selon la locale courante
(fonction)
retourne true si une plage est lexicographiquement inférieure à une autre
(modèle de fonction)
compare deux vues
(fonction membre publique de std::basic_string_view<CharT,Traits> )