63 votes

Différence entre string.empty et string [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' ?

90voto

NathanOliver Points 10062

C++11 et au-delà

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().


Avant C++11

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.


Résumé

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).

36voto

Oberon Points 1721

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' .

24voto

David Haim Points 3696

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.

6voto

Grommit Points 501

empty () n’est pas implémenté car il recherche l’existence d’un caractère nul en position 0, mais simplement

 bool empty() const
{
    return size() == 0 ;
}
 

Ce qui pourrait être différent

4voto

Thomas Points 2676

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.com

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.

Powered by:

X