vérifier si la chaîne commence par une autre chaîne: find or compare?
Si vous voulez savoir si une chaîne commence par un autre, comment voudriez-vous faire cela en C++/STL? En Java il n'y a String.startsWith
Python a également string.startwith
TSL n'ont pas de méthode directe pour elle. Au lieu de cela, il y a std::string::find
et std::string::compare
. Jusqu'à maintenant j'ai utilisé les deux méthodes, principalement en fonction de mon humeur actuelle:
if ( str1.compare( 0, str2.length(), str2 ) == 0 )
do_something();
if ( str1.find(str2) == 0 )
do_something();
Bien sûr, vous pouvez aussi faire str.substr(0,str2.length()) == str2
peut-être il ya encore quelques autres façons d'atteindre le même. find
est un peu plus maniable que compare
mais j'ai vu plus de gens recommander compare
que find
.
Mais qui est préféré? Est-il une différence de performance? Est-il dépendant de l'implémentation (GCC, VC++, etc)?
source d'informationauteur craesh
Vous devez vous connecter pour publier un commentaire.
L'inconvénient de
find
est que sistr1
est long, alors il sera inutilement de recherche, tout le chemin à travers elle pourstr2
. Je n'ai jamais remarqué un optimiseur d'être assez intelligent pour réaliser que vous ne se soucient de savoir si le résultat est 0 ou pas, et arrêtez de chercher après le début destr1
.L'inconvénient de
compare
est que vous devez vérifier questr2.length()
est pas plus grande questr1.length()
(ou attraper le résultant d'exception et de le traiter comme un résultat faux).Malheureusement, la chose la plus proche de ce que vous voulez dans la bibliothèque standard est
std::strncmp
(et bien sûr, vous devez utiliserc_str()
avec qui), d'où la nécessité pourboost::starts_with
ou votre propre équivalent, qui comprend les limites des contrôles.boost a un algorithme
starts_with
qui la met en œuvre assez rapidement: http://www.boost.org/doc/libs/1_41_0/doc/html/boost/algorithm/starts_with.htmlIl n'y a pas d'exigence concernant la façon dont STL implémentations doivent mettre en œuvre les trouver ou de les comparer, d'autres que la norme des choses (les valeurs de retour ...), de sorte qu'il est entièrement dépendant de l'implémentation.
Depuis
find()
pourriez avoir à la recherche par le biais de l'ensemble de lastring
peu importe ce que, vous pouvez l'enveloppercompare()
comme cela si vous voulez:find
peut avez à la recherche par le biais de l'ensemble de la chaîne de la recherche de correspondances, même si le premier caractère n'est pas le cas, je vous suggèrecompare
ou comme indiqué par @Foo Bah vous pouvez utiliser de booststarts_with
algorithme.Vous pouvez essayer
std::l'inadéquation
la seule stupide chose avec cet algorithme est que vous devez vous assurer que la première plage est plus petite ou égale à la deuxième plage.