Espacios de nombres
Variantes
Acciones

std::basic_string::compare

De cppreference.com
< cpp‎ | string‎ | basic string
 
 
 
std::basic_string
 
(1)
int compare(const basic_string& str )const;
(hasta C++11)
int compare(const basic_string& str )constnoexcept;
(desde C++11)
(hasta C++20)
constexprint compare(const basic_string& str )constnoexcept;
(desde C++20)
(2)
int compare( size_type pos1, size_type count1,
             const basic_string& str )const;
(hasta C++20)
constexprint compare( size_type pos1, size_type count1,
                       const basic_string& str )const;
(desde C++20)
(3)
int compare( size_type pos1, size_type count1,

             const basic_string& str,

             size_type pos2, size_type count2 )const;
(hasta C++14)
int compare( size_type pos1, size_type count1,

             const basic_string& str,

             size_type pos2, size_type count2 = npos )const;
(desde C++14)
(hasta C++20)
constexprint compare( size_type pos1, size_type count1,

                       const basic_string& str,

                       size_type pos2, size_type count2 = npos )const;
(desde C++20)
(4)
int compare(const CharT* s )const;
(hasta C++20)
constexprint compare(const CharT* s )const;
(desde C++20)
(5)
int compare( size_type pos1, size_type count1,
             const CharT* s )const;
(hasta C++20)
constexprint compare( size_type pos1, size_type count1,
                       const CharT* s )const;
(desde C++20)
(6)
int compare( size_type pos1, size_type count1,
             const CharT* s, size_type count2 )const;
(hasta C++20)
constexprint compare( size_type pos1, size_type count1,
                       const CharT* s, size_type count2 )const;
(desde C++20)
(7)
template<class T >
int compare(const T& t )constnoexcept(/* véase más abajo */);
(desde C++17)
(hasta C++20)
template<class T >
constexprint compare(const T& t )constnoexcept(/* véase más abajo */);
(desde C++20)
(8)
template<class T >

int compare( size_type pos1, size_type count1,

             const T& t )const;
(desde C++17)
(hasta C++20)
template<class T >

constexprint compare( size_type pos1, size_type count1,

                       const T& t )const;
(desde C++20)
(9)
template<class T >

int compare( size_type pos1, size_type count1,
             const T& t,

             size_type pos2, size_type count2 = npos)const;
(desde C++17)
(hasta C++20)
template<class T >

constexprint compare( size_type pos1, size_type count1,
                       const T& t,

                       size_type pos2, size_type count2 = npos)const;
(desde C++20)

Compara dos secuencias de caracteres.

1) Compara esta cadena con str.
2) Compara una subcadena [pos1, pos1+count1) de esta cadena con str. Si count1 > size()- pos1 la subcadena es [pos1, size()).
3) Compara una subcadena [pos1, pos1+count1) de esta cadena con una subcadena [pos2, pos2+count2) de str. Si count1 > size()- pos1 la primer subcadena es [pos1, size()). De la misma manera, count2 > str.size()- pos2 la segunda subcadena es [pos2, str.size()).
4) Compara esta cadena con la secuencia de caracteres terminada en nulo que empieza en el carácter al que apunta s con longitud Traits::length(s).
5) Compara una subcadena [pos1, pos1+count1) de esta cadena con la secuencia de caracteres terminada en nulo que empieza en el carácter al que apunta s con longitud Traits::length(s). Si count1 > size()- pos1 la subcadena es [pos1, size()).
6) Compara una subcadena [pos1, pos1+count1) de esta cadena con los caracteres en el rango [s, s + count2). Si count1 > size()- pos1 la subcadena es [pos1, size()). (Nota: los caracteres en el rango [s, s + count2) pueden incluir caracteres nulos.)
7) Implícitamente convierte t a una vista sobre cadena sv como si fuera mediante std::basic_string_view<CharT, Traits> sv = t;, entonces compara esta cadena con sv. Esta sobrecarga solo participa en la resolución de sobrecargas si std::is_convertible_v<const T&, std::basic_string_view<CharT, Traits>> es true y std::is_convertible_v<const T&, const CharT*> es false.
8) Implícitamente convierte t a una vista sobre cadena sv como si fuera mediante std::basic_string_view<CharT, Traits> sv = t;, entonces compara una subcadena [pos1, pos1+count1) de esta cadena to sv, como si fuera mediante std::basic_string_view<CharT, Traits>(*this).substr(pos1, count1).compare(sv). Esta sobrecarga solo participa en la resolución de sobrecargas si std::is_convertible_v<const T&, std::basic_string_view<CharT, Traits>> es true y std::is_convertible_v<const T&, const CharT*> es false.
9) Implícitamente convierte t a una vista sobre cadena sv como si fuera mediante std::basic_string_view<CharT, Traits> sv = t;, entonces compara una subcadena [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)). Esta sobrecarga solo participa en la resolución de sobrecargas si std::is_convertible_v<const T&, std::basic_string_view<CharT, Traits>> es true y std::is_convertible_v<const T&, const CharT*> es false.

Una secuencia de caracteres que consiste en count1 caracteres que empieza en data1 se compara con una secuencia de caracteres que consiste en count2 caracteres que empiezan en data2 de la manera siguiente. Primero, calcular el número de caracteres a comparar, como si fuera mediante size_type rlen =std::min(count1, count2). Luego comparar las secuencias llamando a Traits::compare(data1, data2, rlen). Para las cadenas estándar, esta función realiza una comparación lexicográfica de carácter por carácter. Si el resultado es cero (hasta ahora las secuencias de caracteres son iguales), entonces se comparan sus tamaños de la manera siguiente:

Condición Resultado Valor de retorno
Traits::compare(data1, data2, rlen) < 0data1 es menor que data2<0
Traits::compare(data1, data2, rlen) == 0size1 < size2data1 es menor que data2<0
size1 == size2data1 es igual a data20
size1 > size2data1 es mayor que data2>0
Traits::compare(data1, data2, rlen) > 0data1 es mayor que data2>0

Contenido

[editar]Parámetros

str - La otra cadena a comparar.
s - Puntero a la cadena de caracteres a 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) a comparar.

[editar]Valor de retorno

Un valor negativo si *this ocurre antes de la secuencia de caracteres especificada por los argumentos, en orden lexicográfico.

Cero si ambas secuencias de caracteres se comparan como equivalentes.

Un valor positivo si *this ocurre después de la secuencia de caracteres especificada por los argumentos, en orden lexicográfico.

[editar]Excepciones

Las sobrecargas que toman los parámetros denominados pos1 o pos2 lanzan std::out_of_range si el argumento se encuentra fuera de rango.

7)
Especificación noexcept:   (desde C++11)
noexcept(std::is_nothrow_convertible_v<const T&, std::basic_string_view<CharT, Traits>>)
8-9) Lanza cualquier cosa que se lance por la conversión a basic_string_view.

[editar]Posible implementación

template<class CharT, class Traits, class Alloc>int basic_string<CharT, Traits, Alloc>::compare(conststd::basic_string& s)constnoexcept{ 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)return1;return0;}

[editar]Notas

Para las situaciones donde no se requiera comparación de tres vías, std::basic_string proporciona los operadores relacionales habituales (<, <=, ==, >, etc).

Por defecto (con los rasgos de caracteres std::char_traits por defecto), esta función no es susceptible a la configuración regional. Véase std::collate::compare para comparación de cadenas de tres vías susceptible a la configuración regional.

[editar]Ejemplo

#include <cassert>#include <string>#include <iostream>   int main(){// 1) Comparar con otra cadena{int compare_value{std::string{"Batman"}.compare(std::string{"Superman"})};std::cout<<( compare_value <0?"Batman esta antes que Superman\n": compare_value >0?"Superman esta antes que Batman\n":"Superman y Batman son iguales.\n");}   // 2) Comparar subcadena con otra cadena{int compare_value{std::string{"Batman"}.compare(3, 3, std::string{"Superman"})};std::cout<<( compare_value <0?"hombre esta antes que Superman\n": compare_value >0?"Superman esta antes que hombre\n":"hombre y Superman son iguales.\n");}   // 3) Comparar subcadena con otra subcadena{std::string a{"Batman"};std::string b{"Superman"};   int compare_value{a.compare(3, 3, b, 5, 3)};   std::cout<<( compare_value <0?"hombre esta antes que hombre\n": compare_value >0?"hombre esta antes que hombre\n":"hombre y hombre son iguales.\n");// Comparar subcadena con otra subcadena// hasta el final de la otra subcadenaassert(compare_value == a.compare(3, 3, b, 5));}   // 4) Comparar con puntero a char{int compare_value{std::string{"Batman"}.compare("Superman")};   std::cout<<( compare_value <0?"Batman esta antes que Superman\n": compare_value >0?"Superman esta antes que Batman\n":"Superman y Batman son iguales.\n");}   // 5) Comparar subcadena con puntero a char{int compare_value{std::string{"Batman"}.compare(3, 3, "Superman")};   std::cout<<( compare_value <0?"hombre esta antes que Superman\n": compare_value >0?"Superman esta antes que hombre\n":"hombre y Superman son iguales.\n");}   // 6) Comparar subcadena con subcadena de puntero a char{int compare_value{std::string{"Batman"}.compare(0, 3, "Superman", 5)};   std::cout<<( compare_value <0?"Bat esta antes que Super\n": compare_value >0?"Super esta antes que Bat\n":"Super y Bat son iguales.\n");}}

Salida:

Batman esta antes que Superman Superman esta antes que hombre hombre y hombre son iguales. Batman esta antes que Superman Superman esta antes que hombre Bat esta antes que Super

[editar]Informes de defectos

Los siguientes informes de defectos de cambio de comportamiento se aplicaron de manera retroactiva a los estándares de C++ publicados anteriormente.

ID Aplicado a Comportamiento según lo publicado Comportamiento correcto
LWG 2946 C++17 La sobrecarga string_view causa ambigüedad en algunos casos. Se evitó haciéndola una plantilla.
P1148R0 C++11
C++17
noexcept para las sobrecargas (4)/(5) fue accidentalmente eliminado por LWG2064/LWG2946 Se restauró.

[editar]Véase también

Comparación lexicográfica de dos cadenas de texto
(plantilla de función)[editar]
Devuelve una subcadena
(función miembro pública)[editar]
Define la comparación lexicográfica y hashing (resumen) de cadenas.
(plantilla de clase)[editar]
Compara dos cadenas de acuerdo a la configuración regional actual
(función)[editar]
Devuelve true si un rango es lexicográficamente menor que otro.
(plantilla de función)[editar]
close