Acabo de leer algunas recomendaciones sobre el uso
std::string s = get_string();
std::string t = another_string();
if( !s.compare(t) )
{
en vez de
if( s == t )
{
Casi siempre uso el último porque estoy acostumbrado y se siente natural, más legible. Ni siquiera sabía que había una función de comparación separada. Para ser más preciso, pensé que == llamaría a compare ().
¿Cuáles son las diferencias? ¿En qué contextos se debe favorecer un camino al otro?
Solo estoy considerando los casos en los que necesito saber si una cadena tiene el mismo valor que otra cadena.
if(x.compare(y) == 0)
<- signo igual, es igual. El uso de IMO!
solo sirve para hacer que el código sea ilegible.compare
devuelve-1
ifs
es menor quet
y+1
ifs
es mayor quet
mientras que==
returntrue/false
. Los enteros distintos de cero sontrue
y0
sonfalse
.Respuestas:
Esto es lo que la norma tiene que decir sobre
operator==
¡Parece que no hay mucha diferencia!
fuente
!s.compare(t)
ys == t
devolverá el mismo valor, pero la función de comparación proporciona más información ques == t
, ys == t
es más legible cuando no le importa cómo difieren las cadenas, pero solo si difieren.std :: string :: compare () devuelve un
int
:s
yt
son iguales,s
es menor quet
,s
es mayor quet
.Si desea que su primer fragmento de código sea equivalente al segundo, en realidad debería leer:
El operador de igualdad solo prueba la igualdad (de ahí su nombre) y devuelve a
bool
.Para elaborar sobre los casos de uso,
compare()
puede ser útil si está interesado en cómo las dos cadenas se relacionan entre sí (menor o mayor) cuando son diferentes. PlasmaHH menciona con razón los árboles, y también podría ser, por ejemplo, un algoritmo de inserción de cadenas que tiene como objetivo mantener el contenedor ordenado, un algoritmo de búsqueda dicotómica para el contenedor antes mencionado, y así sucesivamente.EDITAR: Como señala Steve Jessop en los comentarios,
compare()
es más útil para la clasificación rápida y los algoritmos de búsqueda binaria. Los tipos naturales y las búsquedas dicotómicas se pueden implementar con solo std :: less .fuente
std::less
, que también es un orden total en este caso) en lugar de un comparador de tres vías .compare()
es para operaciones modeladas enstd::qsort
ystd::bsearch
, a diferencia de aquellas modeladas enstd:sort
ystd::lower_bound
.compare
tiene sobrecargas para comparar subcadenas. Si está comparando cadenas enteras, solo debe usar el==
operador (y si llamacompare
o no es prácticamente irrelevante).fuente
Internamente,
string::operator==()
está utilizandostring::compare()
. Consulte: CPlusPlus -string::operator==()
Escribí una pequeña aplicación para comparar el rendimiento, y aparentemente si compilas y ejecutas tu código en un entorno de depuración
string::compare()
es un poco más rápido questring::operator==()
. Sin embargo, si compila y ejecuta su código en el entorno Release, ambos son más o menos lo mismo.Para su información, ejecuté 1,000,000 de iteraciones para llegar a tal conclusión.
Para demostrar por qué en el entorno de depuración, string :: compare es más rápido, fui al ensamblado y aquí está el código:
DEPURAR CONSTRUIR
cadena :: operador == ()
string :: compare ()
Puede ver que en string :: operator == (), tiene que realizar operaciones adicionales (agregue esp, 8 y movzx edx, al)
LANZAMIENTO CONSTRUIR
cadena :: operador == ()
string :: compare ()
Ambos códigos de ensamblaje son muy similares ya que el compilador realiza la optimización.
Finalmente, en mi opinión, la ganancia de rendimiento es insignificante, por lo tanto, realmente le dejaría al desarrollador decidir cuál es la preferida, ya que ambas logran el mismo resultado (especialmente cuando se trata de la versión de lanzamiento).
fuente
compare()
es equivalente a strcmp ().==
es simple comprobación de igualdad.compare()
por lo tanto, devuelve unint
,==
es un booleano.fuente
compare()
volveráfalse
(bueno,0
) si las cadenas son iguales.Por lo tanto, no tome intercambiar uno por el otro a la ligera.
Use lo que haga que el código sea más legible.
fuente
Si solo desea verificar la igualdad de la cadena, use el operador ==. Determinar si dos cadenas son iguales es más simple que encontrar un orden (que es lo que compara () da), por lo que podría ser mejor en términos de rendimiento en su caso utilizar el operador de igualdad.
Respuesta más larga: la API proporciona un método para verificar la igualdad de la cadena y un método para verificar el orden de las cadenas. Si desea la igualdad de cadenas, utilice el operador de igualdad (para que sus expectativas y las de los implementadores de la biblioteca se alineen). Si el rendimiento es importante, entonces puede probar ambos métodos y encontrar el más rápido.
fuente
Supongamos considerar dos cadenas s y t.
Dales algunos valores.
Cuando los compara usando (s == t) , devuelve un valor booleano (verdadero o falso, 1 o 0).
Pero cuando compara usando s.compare (t) , la expresión devuelve un valor
(i) 0 , si syt son iguales
(ii) <0 , ya sea si el valor del primer carácter no coincidente en s es menor que el de to la longitud de s es menor que la de t.
(iii) > 0 : si el valor del primer carácter no coincidente en t es menor que el de s o la longitud de t es menor que la de s.
fuente
Una cosa que no se cubre aquí es que depende si comparamos cadena con cadena c, cadena con cadena o cadena con cadena.
Una diferencia importante es que para comparar dos cadenas, la igualdad de tamaño se verifica antes de hacer la comparación y eso hace que el operador == sea más rápido que una comparación.
Aquí está la comparación tal como la veo en g ++ Debian 7
fuente