C++: est une chaîne de caractère.empty() toujours équivalent à la chaîne == “”?
Puis-je faire une hypothèse que, compte tenu de
std::string str;
... //do something to str
Est la déclaration suivante est toujours vraie?
(str.empty() == (str == ""))
- str.empty() est plus général. Si un jour vous décidez d'utiliser
std::wstring str
puisstr.empty()
va fonctionner, maisstr == ""
ne sera même pas compiler.
Vous devez vous connecter pour publier un commentaire.
Réponse
Oui. Voici la mise en œuvre de
bits/basic_string.h
, le code debasic_string<_CharT, _Traits, _Alloc>
:Discussion
Même si les deux formes sont équivalentes pour
std::string
, vous peut souhaitez utiliser.empty()
parce qu'il est plus général.En effet, J. F. Sebastian commentaires que si vous passez à l'aide de
std::wstring
au lieu destd::string
, puis==""
n'aurez même pas compiler, parce que vous ne pouvez pas comparer une chaîne dewchar_t
avec l'un dechar
. Ceci, cependant, ne sont pas directement liées à votre question de départ, et je suis à 99% sûr que vous ne serez pas passer àstd::wstring
.Il devrait être. La norme ANSI/ISO standard unis dans 21.3.3
basic_string
de la capacité:Toutefois, à l'article 18 de 21.3.1
basic_string
constructeurs il affirme que le personnage-type de la cession de l'opérateur utilisetraits::length()
pour établir la durée de la séquence contrôlée donc, vous pourriez vous retrouver avec quelque chose d'étrange si vous utilisez une autre spécialisation destd::basic_string<>
.Je pense que le 100% de réponses correctes est que
ou quelque chose comme ça. Si vous n'avez pas fait quelque chose d'étrange, alors
std::string("")
etstd::string()
doit être équivalentIls sont logiquement similaire, mais ils sont à l'essai pour différentes choses.
str.empty()
est de vérifier si la chaîne est vide, où l'autre est la vérification de l'égalité à l'encontre d'un style C chaîne vide. Je voudrais utiliser celle qui est la plus appropriée pour ce que vous essayez de faire. Si vous voulez savoir si une chaîne est vide, puis utilisezstr.empty()
.str.empty() n'est jamais plus lent, mais peut-être plus rapide que str == "". Cela dépend de la mise en œuvre. Donc, vous devriez utiliser str.empty() juste au cas où.
C'est un peu comme utiliser ++i au lieu de i++ pour augmenter un compteur (en supposant que vous n'avez pas besoin du résultat de l'opérateur d'incrémentation lui-même). Votre compilateur peut optimiser, mais vous ne perdez rien pour l'aide ++i, et peut-être remporter quelque chose, alors vous êtes mieux de les utiliser ++i.
En dehors de problèmes de performances, la réponse à votre question est oui; les deux expressions sont logiquement équivalentes.
Oui
(str.empty() == (str == ""))
est toujours* vrai pourstd::string
. Mais n'oubliez pas questring
peut contenir'\0'
caractères. Ainsi, même si l'expressions == ""
peut-être faux,s.c_str()
peut toujours renvoyer un vide C-string. Par exemple:**limitation de surcharge de
operator==
dans l'espace de noms global, comme d'autres l'ont mentionné*Certaines implémentations peuvent tester la valeur null comme premier caractère dans la chaîne résultant en une légère augmentation de la vitesse sur le calcul de la taille de la chaîne.
Je crois que ce n'est pas commun.
const char*
argument, vous feriez toujours besoin de vérifier la chaîne elle-même était vide, donc vous êtes forcément l'ajout de travaux sur un seul test à vide.Normalement, oui.
Mais si quelqu'un décide de redéfinir un opérateur, alors tous les paris sont éteints:
Oui c'est équivalent, mais permet le code de base pour changer la mise en œuvre de ce vide() signifie, en réalité, selon les OS/Hardware/quoi que ce soit et de ne pas nuire à votre code. Il est similaire à la pratique en Java et .NET