Supposons que nous ayons une ficelle
std::string str; // some value is assigned
Quelle est la différence entre str.empty()
et str[0] == '\0'
?
Supposons que nous ayons une ficelle
std::string str; // some value is assigned
Quelle est la différence entre str.empty()
et str[0] == '\0'
?
string_variable[0]
est nécessaire pour rétablir le caractère null si la chaîne est vide. De cette façon, il n'y a pas de comportement indéfini et la comparaison fonctionne encore si la chaîne est vraiment vide. Cependant, vous pourriez avoir une chaîne qui commence par un caractère null ("\0Hi there"
) qui retourne true
, même si elle n'est pas vide. Si vous voulez vraiment savoir si elle est vide, utilisez empty()
.
La différence est que si la chaîne est vide, alors string_variable[0]
a un comportement indéfini; Il n'y a pas d'index 0, sauf si la chaîne est - const
-qualifiés. Si la chaîne est - const
qualifiés, alors il sera de retour un caractère nul.
string_variable.empty()
d'autre part renvoie true si la chaîne est vide et false si elle ne l'est pas; le comportement ne sera pas défini.
empty()
est là pour vérifier si la chaîne de caractères/conteneur est vide ou pas. Il fonctionne sur tous les contenants qui les fournissent et à l'aide de empty
indique clairement votre intention - qui signifie beaucoup pour les gens de la lecture de votre code (y compris vous).
Depuis C ++11, il est garanti que str[str.size()] == '\0'
. Cela signifie que si une chaîne est vide, alors str[0] == '\0'
. Mais une chaîne C ++ a un champ de longueur explicite, ce qui signifie qu’elle peut contenir des caractères null incorporés.
Par exemple, pour std::string str("\0ab", 3)
, str[0] == '\0'
mais str.empty()
est faux.
En outre, str.empty()
est plus lisible que str[0] == '\0'
.
D'autres réponses ici sont 100% correct. Je veux juste ajouter trois remarques:
empty
générique (chaque conteneur STL implémente cette fonction), alors que operator []
avec size_t
fonctionne uniquement avec des objets string et tableau-comme des conteneurs. lorsque vous traitez avec des génériques de code STL, empty
est préféré.
aussi, empty
est assez explicite alors qu' =='\0'
n'est pas beaucoup.
quand il est 2H du matin et déboguer votre code, vous préférez voir if(str.empty())
ou if(str[0] == '\0')
?
si seulement la fonctionnalité des questions, nous sommes tous d'écrire à la vanille de l'assemblée.
il y a aussi une perte de performance en cause. empty
est généralement mis en œuvre par la comparaison de la taille du membre de la chaîne à zéro, ce qui est très bon marché, facile à inline etc. une comparaison avec le premier caractère peut-être plus lourd. tout d'abord, puisque toutes les chaînes de mettre en œuvre à court optimisation de la chaîne, le programme doit d'abord se demander si la chaîne est "court" ou "mode long mode". ramification pire performance. si la chaîne est longue, de déférence, il peut être coûteux si la chaîne a été "ignoré" pour un certain temps et le déréférencement d'elle-même peut entraîner un cache-faute, ce qui est coûteux.
Aussi, méfiez-vous des fonctions que vous utiliserez si vous utilisez C ++ 11 ou une version ultérieure:
#include <iostream>
#include <cstring>
int main() {
std::string str("\0ab", 3);
std::cout << "The size of str is " << str.size() << " bytes.\n";
std::cout << "The size of str is " << str.length() << " long.\n";
std::cout << "The size of str is " << std::strlen(str.c_str()) << " long.\n";
return 0;
}
reviendra
La taille de str est de 3 octets.
La taille de str est 3 long.
La taille de str est 0 longue.
Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.