Pourquoi la bibliothèque de chaînes de caractères C++ est-elle plus efficace ? Après tout, au fond, les chaînes ne sont-elles pas toujours représentées par des tableaux de caractères ?
Parce que le code qui utilise char*
ou char[]
a plus de chances d'être inefficace s'il n'est pas rédigé avec soin. Par exemple, avez-vous vu boucle comme ça :
char *get_data();
char const *s = get_data();
for(size_t i = 0 ; i < strlen(s) ; ++i) //Is it efficent loop? No.
{
//do something
}
Est-ce efficace ? Non. La complexité temporelle de strlen()
est O(N)
et de plus, elle est calculée à chaque itération, dans le code ci-dessus.
Maintenant, vous pouvez dire "Je peux le rendre efficace si j'appelle strlen()
juste une fois." . Bien sûr, vous le pouvez. Mais vous devez faire toute cette sorte d'optimisation vous-même et consciemment . Si vous avez manqué quelque chose, vous avez manqué des cycles de CPU. Mais avec std::string
La plupart de ces optimisations sont effectuées par la classe elle-même. Vous pouvez donc écrire ceci :
std::string get_data();
std::string const & s = get_data(); //avoid copy if you don't need it
for(size_t i = 0 ; i < s.size() ; ++i) //Is it efficent loop? Yes.
{
//do something
}
Est-ce efficace ? Oui. La complexité temporelle de size()
est O(1)
. Il n'est pas nécessaire de l'optimiser manuellement, ce qui rend souvent le code laid et difficile à lire. Le code résultant avec std::string
est presque toujours soignée et propre par rapport aux char*
.
Notez également que std::string
ne rend pas seulement votre code efficace en termes de cycles CPU, mais il augmente également l'efficacité du programmeur !