Namespaces
Variants

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

From cppreference.net
std::basic_string
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,

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

const StringViewLike & t ) const ;
(8) (desde C++17)
(constexpr desde 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) (desde C++17)
(constexpr 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 primera subcadena es [ pos1 , size ( ) ) .
  • Si count2 > str. size ( ) - pos2 , la segunda subcadena es [ pos2 , str. size ( ) ) .
4) Compara esta cadena con la secuencia de caracteres terminada en nulo que comienza en el carácter apuntado por 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 comienza en el carácter apuntado por 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 ) . Los caracteres en [ s , s + count2 ) pueden incluir caracteres nulos.
  • Si count1 > size ( ) - pos1 , la subcadena es [ pos1 , size ( ) ) .
7-9) Convierte implícitamente t a una string view sv como si fuera mediante std:: basic_string_view < CharT, Traits > sv = t ; , luego
7) compara esta cadena con sv ;
8) compara una subcadena [ pos1 , pos1 + count1 ) de esta cadena con sv , como si fuera mediante std:: basic_string_view < CharT, Traits > ( * this ) . substr ( pos1, count1 ) . compare ( sv ) ;
9) 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 ) )
.
Estas sobrecargas participan en la resolución de sobrecarga solo si std:: is_convertible_v < const StringViewLike & ,
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.

7)
noexcept especificación:
noexcept ( std:: is_nothrow_convertible_v < const T & , std:: basic_string_view < CharT, Traits >> )
8,9) Lanza cualquier excepción generada por la conversión a std::basic_string_view .

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