Comparación de cadenas usando std::string::compare, c++ [duplicado]

Resuelto Medvednic asked hace 10 años • 3 respuestas

Tengo una pregunta:

Digamos que hay dos std::strings y quiero compararlos, existe la opción de usar la compare()función de la stringclase pero también noté que es posible usar < > !=operadores simples (ambos casos son posibles incluso si no incluyo el <string>biblioteca). ¿Alguien puede explicar por qué compare()existe la función si se puede hacer una comparación utilizando operadores simples?

Por cierto, uso Code::Blocks 13.12, aquí hay un ejemplo de mi código:

#include <iostream>
#include <string>

using std::cin;
using std::cout;
using std::endl;
using std::string;
using std::getline;

int main()
{
    string temp1, temp2;
    cout << "Enter first word: ";
    getline (cin,temp1);
    cout << "Enter second word: ";
    getline (cin,temp2);
    cout << "First word: " << temp1 << endl << "Second word: " << temp2 << endl;
    if (temp1 > temp2)
    {
        cout << "One" << endl;
    }
    if (temp1.compare(temp2) < 0)
    {
        cout << "Two" << endl;
    }
    return 0;
}    
Medvednic avatar Jul 25 '14 21:07 Medvednic
Aceptado

.compare()devuelve un número entero, que es una medida de la diferencia entre las dos cadenas.

  • Un valor de retorno de 0indica que las dos cadenas se comparan como iguales.
  • Un valor positivo significa que la cadena comparada es más larga o que el primer carácter que no coincide es mayor.
  • Un valor negativo significa que la cadena comparada es más corta o que el primer carácter que no coincide es más bajo.

operator==simplemente devuelve un valor booleano, que indica si las cadenas son iguales o no.

Si no necesita detalles adicionales, también puede usar ==.

Tom Fenech avatar Jul 25 '2014 14:07 Tom Fenech
string cat = "cat";
string human = "human";

cout << cat.compare(human) << endl; 

Este código dará -1 como resultado. Esto se debe a que el primer carácter no coincidente de la cadena comparada, 'h', es inferior o aparece después de 'c' en orden alfabético, aunque la cadena comparada, 'humano', es más larga que 'gato'.

Creo que el valor de retorno descrito en cplusplus.com es más preciso y son:

0: Se comparan iguales

<0: O el valor del primer carácter que no coincide es inferior en la cadena comparada o todos los caracteres comparados coinciden pero la cadena comparada es más corta.

más de 0: el valor del primer carácter que no coincide es mayor en la cadena comparada o todos los caracteres comparados coinciden pero la cadena comparada es más larga.

Además, la descripción de IMO cppreference.com es más simple y hasta ahora describe mejor según mi propia experiencia.

valor negativo si *thisaparece antes de la secuencia de caracteres especificada por los argumentos, en orden lexicográfico

cero si ambas secuencias de caracteres se comparan equivalentes

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

Idz avatar Dec 11 '2016 15:12 Idz

Respecto a la pregunta ,

¿ Alguien puede explicar por qué compare()existe la función si se puede hacer una comparación utilizando operandos simples?

En relación con <y ==, la comparefunción es conceptualmente más simple y en la práctica puede ser más eficiente ya que evita dos comparaciones por artículo para el pedido normal de artículos.


Como ejemplo de simplicidad, para valores enteros pequeños puedes escribir una función de comparación como esta:

auto compare( int a, int b ) -> int { return a - b; }

lo cual es altamente eficiente.

Ahora para una estructura

struct Foo
{
    int a;
    int b;
    int c;
};

auto compare( Foo const& x, Foo const& y )
    -> int
{
    if( int const r = compare( x.a, y.a ) ) { return r; }
    if( int const r = compare( x.b, y.b ) ) { return r; }
    return compare( x.c, y.c );
}

Tratar de expresar esta comparación lexicográfica directamente en términos de <usted termina con una complejidad e ineficiencia horrendas, relativamente hablando.


Con C++ 11, solo por simplicidad, la comparación lexicográfica ordinaria basada en comparaciones menores se puede implementar de manera muy simple en términos de comparación de tuplas.

Cheers and hth. - Alf avatar Jul 25 '2014 14:07 Cheers and hth. - Alf