std::basic_string<CharT,Traits,Allocator>:: compare
|
int
compare
(
const
basic_string
&
str
)
const
;
|
(1) |
(noexcept desde C++11)
(constexpr desde C++20) |
|
int
compare
(
size_type pos1, size_type count1,
const basic_string & str ) const ; |
(2) | (constexpr desde C++20) |
| (3) | ||
|
int
compare
(
size_type pos1, size_type count1,
const
basic_string
&
str,
|
(hasta C++14) | |
|
int
compare
(
size_type pos1, size_type count1,
const
basic_string
&
str,
|
(desde C++14)
(constexpr desde C++20) |
|
|
int
compare
(
const
CharT
*
s
)
const
;
|
(4) | (constexpr desde C++20) |
|
int
compare
(
size_type pos1, size_type count1,
const CharT * s ) const ; |
(5) | (constexpr desde C++20) |
|
int
compare
(
size_type pos1, size_type count1,
const CharT * s, size_type count2 ) const ; |
(6) | (constexpr desde C++20) |
|
template
<
class
StringViewLike
>
int compare ( const StringViewLike & t ) const noexcept ( /* ver más abajo */ ) ; |
(7) |
(desde C++17)
(constexpr desde C++20) |
|
template
<
class
StringViewLike
>
int
compare
(
size_type pos1, size_type count1,
|
(8) |
(desde C++17)
(constexpr desde C++20) |
|
template
<
class
StringViewLike
>
int
compare
(
size_type pos1, size_type count1,
|
(9) |
(desde C++17)
(constexpr desde C++20) |
Compara dos secuencias de caracteres.
[
pos1
,
pos1
+
count1
)
de esta cadena con
str
.
-
Si
count1
>
size
(
)
-
pos1
, la subcadena es
[pos1,size ( )).
[
pos1
,
pos1
+
count1
)
de esta cadena con una subcadena
[
pos2
,
pos2
+
count2
)
de
str
.
-
Si
count1
>
size
(
)
-
pos1
, la primera subcadena es
[pos1,size ( )). -
Si
count2
>
str.
size
(
)
-
pos2
, la segunda subcadena es
[pos2,str. size ( )).
[
pos1
,
pos1
+
count1
)
de esta cadena con la secuencia de caracteres terminada en nulo que comienza en el carácter apuntado por
s
con longitud
Traits
::
length
(
s
)
.
-
Si
count1
>
size
(
)
-
pos1
, la subcadena es
[pos1,size ( )).
[
pos1
,
pos1
+
count1
)
de esta cadena con los caracteres en el rango
[
s
,
s
+
count2
)
. Los caracteres en
[
s
,
s
+
count2
)
pueden incluir caracteres nulos.
-
Si
count1
>
size
(
)
-
pos1
, la subcadena es
[pos1,size ( )).
[
pos1
,
pos1
+
count1
)
de esta cadena con
sv
, como si fuera mediante
std::
basic_string_view
<
CharT, Traits
>
(
*
this
)
.
substr
(
pos1, count1
)
.
compare
(
sv
)
;
[
pos1
,
pos1
+
count1
)
de esta cadena con una subcadena
[
pos2
,
pos2
+
count2
)
de
sv
, como si fuera mediante
std::
basic_string_view
<
CharT, Traits
>
(
*
this
)
. substr ( pos1, count1 ) . compare ( sv. substr ( pos2, count2 ) ) .
std:: basic_string_view < CharT, Traits >> es true y std:: is_convertible_v < const StringViewLike & , const CharT * > es false .
Una secuencia de caracteres que consiste en count1 caracteres comenzando en data1 se compara con una secuencia de caracteres que consiste en count2 caracteres comenzando en data2 de la siguiente manera:
- Primero, calcula el número de caracteres a comparar, como si fuera mediante size_type rlen = std:: min ( count1, count2 ) .
- Luego compara las secuencias llamando a Traits :: compare ( data1, data2, rlen ) . Para cadenas estándar esta función realiza una comparación lexicográfica carácter por carácter. Si el resultado es cero (las secuencias de caracteres son iguales hasta ahora), entonces sus tamaños se comparan de la siguiente manera:
| Condición | Resultado | Valor de retorno | |
|---|---|---|---|
Traits::compare(
data1
,
data2
,
rlen
) < 0
|
data1 es menor que data2 | < 0 | |
Traits::compare(
data1
,
data2
,
rlen
) == 0
|
size1 < size2 | data1 es menor que data2 | < 0 |
| size1 == size2 | data1 es igual a data2 | 0 | |
| size1 > size2 | data1 es mayor que data2 | > 0 | |
Traits::compare(
data1
,
data2
,
rlen
) > 0
|
data1 es mayor que data2 | > 0 | |
Contenidos |
Parámetros
| str | - | otra cadena con la que comparar |
| s | - | puntero a la cadena de caracteres con la que comparar |
| count1 | - | número de caracteres de esta cadena a comparar |
| pos1 | - | posición del primer carácter en esta cadena a comparar |
| count2 | - | número de caracteres de la cadena dada a comparar |
| pos2 | - | posición del primer carácter de la cadena dada a comparar |
| t | - | objeto (convertible a std::basic_string_view ) con el que comparar |
Valor de retorno
- Valor negativo si * this aparece antes de la secuencia de caracteres especificada por los argumentos, en orden lexicográfico.
- Cero si ambas secuencias de caracteres son equivalentes en la comparación.
- Valor positivo si * this aparece después de la secuencia de caracteres especificada por los argumentos, en orden lexicográfico.
Excepciones
Las sobrecargas que toman parámetros llamados pos1 o pos2 lanzan std::out_of_range si el argumento está fuera de rango.
Si se lanza una excepción por cualquier razón, esta función no tiene efecto ( strong exception safety guarantee ).
Implementación posible
| sobrecarga (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; } |
Notas
Para las situaciones en las que no se requiere una comparación de tres vías,
std::basic_string
proporciona los
operadores relacionales
habituales (
<
,
<=
,
==
,
>
, etc).
Por defecto (con la configuración predeterminada de std::char_traits ), esta función no es sensible a la configuración regional. Consulte std::collate::compare para comparación de cadenas triple con reconocimiento de configuración regional.
Ejemplo
#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) << " viene antes de " << std::quoted(str2) << ".\n"; else if (compare_result > 0) std::cout << std::quoted(str2) << " viene antes de " << std::quoted(str1) << ".\n"; else std::cout << std::quoted(str1) << " y " << std::quoted(str2) << " son iguales.\n"; } int main() { std::string batman{"Batman"}; std::string superman{"Superman"}; int compare_result{0}; // 1) Comparar con otra cadena compare_result = batman.compare(superman); std::cout << "1) "; print_compare_result("Batman", "Superman", compare_result); // 2) Comparar subcadena con otra cadena compare_result = batman.compare(3, 3, superman); std::cout << "2) "; print_compare_result("man", "Superman", compare_result); // 3) Comparar subcadena con otra subcadena compare_result = batman.compare(3, 3, superman, 5, 3); std::cout << "3) "; print_compare_result("man", "man", compare_result); // Comparar subcadena con otra subcadena // por defecto hasta el final de la otra cadena assert(compare_result == batman.compare(3, 3, superman, 5)); // 4) Comparar con puntero a caracteres compare_result = batman.compare("Superman"); std::cout << "4) "; print_compare_result("Batman", "Superman", compare_result); // 5) Comparar subcadena con puntero a caracteres compare_result = batman.compare(3, 3, "Superman"); std::cout << "5) "; print_compare_result("man", "Superman", compare_result); // 6) Comparar subcadena con subcadena de puntero a caracteres compare_result = batman.compare(0, 3, "Superman", 5); std::cout << "6) "; print_compare_result("Bat", "Super", compare_result); }
Salida:
1) "Batman" viene antes de "Superman". 2) "Superman" viene antes de "man". 3) "man" y "man" son iguales. 4) "Batman" viene antes de "Superman". 5) "Superman" viene antes de "man". 6) "Bat" viene antes de "Super".
Informes de defectos
Los siguientes informes de defectos que modifican el comportamiento se aplicaron retroactivamente a los estándares publicados anteriormente de C++.
| DR | Aplicado a | Comportamiento publicado | Comportamiento correcto |
|---|---|---|---|
| LWG 5 | C++98 |
el parámetro
count2
de la sobrecarga
(6)
tenía un argumento por defecto npos |
argumento por defecto eliminado,
dividido en sobrecargas (5) y (6) |
| LWG 847 | C++98 | no había garantía de seguridad de excepciones | añadida garantía de seguridad fuerte de excepciones |
| LWG 2946 | C++17 | la sobrecarga (7) causaba ambigüedad en algunos casos | evitado al convertirla en plantilla |
| P1148R0 | C++17 |
noexcept para la sobrecarga
(7)
fue eliminado
accidentalmente por la resolución de LWG2946 |
restaurado |
Véase también
|
(eliminado en C++20)
(eliminado en C++20)
(eliminado en C++20)
(eliminado en C++20)
(eliminado en C++20)
(C++20)
|
compara lexicográficamente dos cadenas
(plantilla de función) |
|
devuelve una subcadena
(función miembro pública) |
|
|
define comparación lexicográfica y hashing de cadenas
(plantilla de clase) |
|
|
compara dos cadenas de acuerdo a la configuración regional actual
(función) |
|
|
devuelve
true
si un rango es lexicográficamente menor que otro
(plantilla de función) |
|
|
compara dos vistas
(función miembro pública de
std::basic_string_view<CharT,Traits>
)
|