Acabei de ler algumas recomendações sobre o uso
std::string s = get_string();
std::string t = another_string();
if( !s.compare(t) )
{
ao invés de
if( s == t )
{
Estou quase sempre usando o último porque estou acostumado a isso e parece natural, mais legível. Eu nem sabia que havia uma função de comparação separada. Para ser mais preciso, pensei que == chamaria compare ().
Quais são as diferenças? Em quais contextos uma maneira deve ser favorecida à outra?
Estou considerando apenas os casos em que preciso saber se uma string tem o mesmo valor que outra string.
if(x.compare(y) == 0)
<- sinal de igual, é igual. O IMO usando!
serve apenas para tornar o código ilegível.compare
return-1
ses
for menor quet
e+1
ses
for maior quet
while==
returntrue/false
. Inteiros diferentes de zero sãotrue
e0
sãofalse
.Respostas:
É isso que o padrão tem a dizer sobre
operator==
Parece que não há muita diferença!
fonte
!s.compare(t)
es == t
retornará o mesmo valor, mas a função comparar fornece mais informações do ques == t
es == t
é mais legível quando você não se importa com a diferença entre as seqüências, mas apenas se elas diferem.std :: string :: compare () retorna um
int
:s
et
são iguais,s
for menor quet
,s
for maior quet
.Se você deseja que seu primeiro trecho de código seja equivalente ao segundo, ele deve realmente ler:
O operador de igualdade testa apenas a igualdade (daí seu nome) e retorna a
bool
.Para elaborar os casos de uso,
compare()
pode ser útil se você estiver interessado em saber como as duas seqüências se relacionam (menos ou maior) quando elas são diferentes. O PlasmaHH menciona com razão as árvores e também pode ser, por exemplo, um algoritmo de inserção de string que visa manter o contêiner classificado, um algoritmo de pesquisa dicotômica para o contêiner mencionado e assim por diante.EDIT: Como Steve Jessop aponta nos comentários,
compare()
é mais útil para ordenação rápida e algoritmos de pesquisa binária. Classificações naturais e pesquisas dicotômicas podem ser implementadas apenas com std :: less .fonte
std::less
, que também é uma ordem total nesse caso), em vez de um comparador de três vias .compare()
é para operações modeladas emstd::qsort
estd::bsearch
, em oposição às modeladas emstd:sort
estd::lower_bound
.compare
possui sobrecargas para comparar substrings. Se você estiver comparando cadeias inteiras, use o==
operador (e se chamacompare
ou não, é praticamente irrelevante).fonte
Internamente,
string::operator==()
está usandostring::compare()
. Consulte: CPlusPlus -string::operator==()
Eu escrevi um pequeno aplicativo para comparar o desempenho e, aparentemente, se você compilar e executar seu código no ambiente de depuração,
string::compare()
é um pouco mais rápido questring::operator==()
. No entanto, se você compilar e executar seu código no ambiente Release, ambos serão praticamente iguais.Para sua informação, executei 1.000.000 de iterações para chegar a essa conclusão.
Para provar por que, no ambiente de depuração, a string :: compare é mais rápida, fui ao assembly e aqui está o código:
DEBUG BUILD
string :: operator == ()
string :: compare ()
Você pode ver que em string :: operator == (), ele precisa executar operações extras (adicione esp, 8 e movzx edx, al)
CONSTRUÇÃO DE LANÇAMENTO
string :: operator == ()
string :: compare ()
Ambos os códigos de montagem são muito semelhantes, pois o compilador executa a otimização.
Finalmente, na minha opinião, o ganho de desempenho é insignificante, portanto, eu realmente deixaria para o desenvolvedor decidir qual é o preferido, pois ambos alcançam o mesmo resultado (especialmente quando é a versão lançada).
fonte
compare()
é equivalente a strcmp ().==
é simples verificação de igualdade.compare()
portanto retorna umint
,==
é um booleano.fonte
compare()
retornaráfalse
(bem0
) se as strings forem iguais.Portanto, não pense em trocar um pelo outro de ânimo leve.
Use o que tornar o código mais legível.
fonte
Se você quiser apenas verificar a igualdade das cadeias, use o operador ==. Determinar se duas seqüências são iguais é mais simples do que encontrar uma ordenação (que é o que compare () dá,) para que ele possa ser melhor em termos de performance no seu caso para usar o operador de igualdade.
Resposta mais longa: a API fornece um método para verificar a igualdade de cadeias e um método para verificar a ordem das cadeias. Você deseja igualdade de string, portanto, use o operador de igualdade (para que suas expectativas e as dos implementadores de bibliotecas se alinhem.) Se o desempenho for importante, você poderá testar os dois métodos e encontrar o mais rápido.
fonte
Suponha que considere duas cadeias s e t.
Dê a eles alguns valores.
Quando você os compara usando (s == t), ele retorna um valor booleano (verdadeiro ou falso, 1 ou 0).
Mas quando você compara usando s.compare (t) , a expressão retorna um valor
(i) 0 - se s e t forem iguais
(ii) <0 - se o valor do primeiro caractere não correspondido em s for menor que o valor de t ou o comprimento de s é menor que o de t.
(iii) > 0 - se o valor do primeiro caractere não correspondido em t for menor que o de s ou se o comprimento de t for menor que o de s.
fonte
Uma coisa que não é abordada aqui é que depende se compararmos string com c string, c string com string ou string com string.
Uma grande diferença é que, para comparar duas cadeias, a igualdade de tamanho é verificada antes de fazer a comparação e isso torna o operador == mais rápido que uma comparação.
aqui está a comparação que eu vejo no g ++ Debian 7
fonte