std::basic_string<CharT,Traits,Allocator>:: compare
|
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,
|
(jusqu'à C++14) | |
|
int
compare
(
size_type pos1, size_type count1,
const
basic_string
&
str,
|
(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,
|
(8) |
(depuis C++17)
(constexpr depuis C++20) |
|
template
<
class
StringViewLike
>
int
compare
(
size_type pos1, size_type count1,
|
(9) |
(depuis C++17)
(constexpr depuis C++20) |
Compare deux séquences de caractères.
[
pos1
,
pos1
+
count1
)
de cette chaîne à
str
.
-
Si
count1
>
size
(
)
-
pos1
, la sous-chaîne est
[pos1,size ( )).
[
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 ( )).
[
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 ( )).
[
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 ( )).
[
pos1
,
pos1
+
count1
)
de cette chaîne à
sv
, comme par
std::
basic_string_view
<
CharT, Traits
>
(
*
this
)
.
substr
(
pos1, count1
)
.
compare
(
sv
)
;
[
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 ) ) .
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.
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>
)
|