Comparación de cadenas usando std::string::compare, c++ [duplicado]
Tengo una pregunta:
Digamos que hay dos std::string
s y quiero compararlos, existe la opción de usar la compare()
función de la string
clase 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;
}
.compare()
devuelve un número entero, que es una medida de la diferencia entre las dos cadenas.
- Un valor de retorno de
0
indica 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 ==
.
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
*this
aparece antes de la secuencia de caracteres especificada por los argumentos, en orden lexicográficocero si ambas secuencias de caracteres se comparan equivalentes
valor positivo si
*this
aparece después de la secuencia de caracteres especificada por los argumentos, en orden lexicográfico
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 compare
funció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.