Vérifier si un vecteur est vide
Supposons que j'ai un std::vector
dire Vector
Maintenant, après l'exécution de certaines opérations sur les vecteurs(soit de l'insertion ou de la suppression) je veux vérifier si le vecteur est vide et sur la base de ce que je veux effectuer certaines opérations.
L'approche la mieux
Approche 1
if (Vector.size() == 0){ /* operations */ }
Approche 2
if (Vector.empty()) { /* operations */ }
Qui est une meilleure approche, 1
ou 2
?
Vous devez vous connecter pour publier un commentaire.
v.size() == 0
dit "je suis la comparaison de la taille", mais le fait de vérifier si le conteneur vide. Il y a un petit algorithme pour digérer (très petit, car il ne se compose que d'une comparaison) avant de savoir ce qu'il fait.Otoh, que,
v.empty()
fait exactement ce qu'il dit: il vérifie siv
est vide.Pour cette raison, de toute évidence, je préfère la n ° 2, car il fait ce qu'il dit. C'est pourquoi
empty()
a été inventé, après tout.Mais il y a aussi une algorithmique raison de préférer
empty()
: Si quelqu'un à plus tard les changementsstd::vector
dans unstd::list
,v.size()
pourrait ont O(n). (En C++ 03 c'est la garantie d'être en O(1) pourstd::vector
, mais pas pourstd::list
. Selon James' commentaire à Prasoon réponse il sera O(1) pour tous conteneurs en C++1x.)list
(c'est en fait une splice()-vitesse par rapport à la taille()-vitesse). Je n'arrive pas à obtenir le livre blanc pour l'instant, mais Michael Burr résumé..x
est un espace réservé oui, mais le nom est aussi un espace réservé, il n'importe pas vraiment ce que c' moyen. Et C++0x ne rentrera pas en conflit avec C++03, parce que personne n'a jamais utilisé le nom de C++0x pour se référer à C++03.;) Rappelez-vous, je parle de la façon dont les noms sont effectivement utilisés dans la pratique, et non pas ce sens a été prévu quand ils ont été inventés. À ma connaissance, le C++0x nom n'a jamais été utilisé pour se référer à autre chose que ce qui est le plus probable à la fin de C++11. C++1x est moins bien établie, et pourrait, reportez-vous à "C++0x+1" ainsi que le C++0x lui-même.empty()
est la langue anglaise. Il est ambigu si "vide" est un verbe ou un adjectif!Je dirais approche n ° 2, en tant que méthode empty() a été conçu pour vérifier si un vecteur est vide. Vous pouvez également vérifier la efficiance des deux approches, et de décider lequel est le mieux.
empty
méthode est particulièrement bon pourstd::list
s parce que le calcul de leur taille peut être très.......long.list
ont une constante de tempssize()
; en C++0x,size()
devront avoir une constante de temps de la complexité pour tous les conteneurs, y comprislist
.list
, si vous arrive d'utilisersplice
et souhaitez que à la constante de temps de la place. Ensuite, c'est le retour à avoirmy_list::size
être O(N).splice
à O(n), mais je suis sûr que c'est nécessaire pour être en O(1).Approche
(2)
serait mieux parce queempty()
s'exécute toujours dans un temps constant [j'.e O(1)] quel que soit le type de conteneur.size()
trop s'exécute dansO(1)
[std::vector] bien qu'il puisse s'exécuter dansO(n)
pourstd:list
[c'est la mise en œuvre définies pour être honnête]Dans
Effective STL
[Point 4] Scott Meyers ditsize()
est tout sauf garanti à O(1), en particulier pour lesvector
. Dans C++0x,size()
devra être en O(1) pour tout conteneur qui l'implémente.size()
doit ont de la constante de temps de la complexité (ce qui signifie qu'il n'y a pas une complexité à tous). C++0x changements. Je me suis trompé dans mon premier commentaire, quand j'ai dit "pour les tout conteneur qui l'implémente," si tous les contenants doivent mettre en œuvresize()
.vector
?!Généralement un vecteur est mis en œuvre en interne comme un pointeur vers un tableau alloué dynamiquement,et des données des membres de la tenue de la
capacity
etsize
du vecteur. Lesize
du vecteur est le nombre réel d'éléments, tandis que la capacité se réfère à la taille du tableau dynamique.Compte tenu de cette mise en œuvre, la fonction de membre de
size()
aurez simplement à être un getter pour le membresize
.La
empty()
sera de retour le résultat de la comparaisonsize == 0
.De sorte que les deux sont tout aussi efficaces
O(1)
mais il est recommandé deempty()
si vous voulez vérifier si le vecteur est vide. Parce que c'est ce que la fonction est là pour. Il va rendre votre code plus facile à lire.Si vous êtes nouveau à la programmation, utilisez celle qui a le plus de sens pour vous. Par exemple, si ==0 est plus important pour vous que .empty(), utilisez-la.
Plus tard, si vous avez des problèmes de performances (ce dont je doute fort que vous aurez ici) utiliser un seul qui répond à vos objectifs de performance.
std::vector
à unstd::list
dans le futur)..empty()
est qu'il n'est pas clair si c'est une opération qui permettra d'éliminer tous les éléments du conteneur, ou si c'est vous dire si le conteneur est vide ou pas.isEmpty()
serait plus mon style. Mais c'est la nature des conventions de nommage dans la bibliothèque standard. Et je serais obligé de passer derrière le "when in Rome..." règle; vous devriez favoriser le mieux invariant pour si le conteneur des changements. Donc, quelqu'un va à travers une base de code et le remplacement de tous lesx.size() == 0
modèles avecx.empty()
serait justifié--je dirais que c'est le droit réponse dans ce contexte.En fait un vecteur.empty() et de vecteur.size()==0 sont en train de faire la même chose.
vide compare le début et la fin et retourne vrai si elles sont identiques, la taille calcule commencer à la fin de l'effet de retour 0 si elle est vide à cet effet faire la même chose à l'aide d'un autre calcul.
Juste pour le fun: pourquoi pas:
?
Aller pour le vide().