Préface forte>
Je suis un développeur Java qui joue avec C ++ dans mon temps libre / ennuyé.
En C ++, vous voyez souvent Pop prenant un argument par référence: P> Item pop() throws StackException;
5 Réponses :
Pour répondre à la question: Vous ne devez pas implémenter la fonction POP en C ++, car elle est déjà mise en œuvre par la STL. Pourquoi devrait-il être fait de cette façon? P> n'importe quel code qui souhaite obtenir une copie de l'élément peut le faire sans frais supplémentaires: p> aussi, Cette discussion peut être intéressante. P> Si vous alliez Pour mettre en œuvre la pop pour renvoyer la valeur, cela n'a pas beaucoup d'importance si vous revenez de valeur ou écrivez-le dans un paramètre OUT. La plupart des compilateurs implémentent RVO , qui optimisera la méthode de retour-valeur pour être tout aussi efficace. comme méthode de copie-sortie-paramètre. Gardez simplement à l'esprit que l'un de ceux-ci sera probablement moins efficace que d'examiner l'objet à l'aide du sommet () ou de l'avant (), car dans ce cas, il n'y a absolument aucune copie terminée. P> P> std :: pile code>
adaptateur de conteneur fournit le Méthode TOP code> Pour obtenir une référence à l'élément supérieur de la pile et la méthode
pop code> pour supprimer l'élément supérieur. Notez que la méthode
POP code> seule ne peut être utilisée seul pour effectuer les deux actions, comme vous l'avez posé de questions.
haut code> prend en charge une responsabilité et
pop code> prend soin de l'autre. li>
Des liens géniaux, merci beaucoup. Donc, si on me demande dans une interview de mettre en œuvre POP () en C ++ ... Devrais-je leur donner votre réponse? : p
+ 1 ... Mais peut-être "Si vous implémentez la fonction POP en C ++, vous devez suivre l'interface de conteneur standard."
@Stephano: Cela dépend de ce que l'intervieweur veut. Certains peuvent être convaincus que vous connaissez sur std :: pile code> et savoir qu'il a
appuyez sur code>,
haut code> et
pop code> méthodes. Certains peuvent vouloir que vous appliquiez votre propre pile à l'aide d'un tableau de longueur fixe, juste pour voir si vous pouvez le faire.
BTW une bonne question de suivi, si une personne interviewée mentionnée std :: pile code>, serait de demander quel type de conteneur sous-jacent est utilisé dans cet adaptateur et pourquoi c'est un bon choix.
@Dan: Vous devriez préciser la réponse que le std :: pile :: pop () code> a une interface différente de celle de la question (c.-à-d., Que
pop () code > ON; Y Ajuste le conteneur, il ne renvoie pas l'élément supérieur en tant que valeur RTURN ou via une référence transmise).
Le problème avec l'approche Java est que sa méthode à la manière de la manière stl des choses que l'idée est que parfois lorsque vous Si vous fournissez deux surcharges, un qui prend une référence et une autre qui ne permet pas à l'utilisateur de choisir s'il est intéressé par l'élément renvoyé ou non. La performance de l'appel sera optimale. P>
La STL ne surcharge pas les fonctions pop () code> a au moins deux effets: supprimer un élément et renvoyer un élément. Cela viole le principe de la conception logicielle unique, qui ouvre à son tour la porte des complexités de conception et d'autres problèmes. Cela implique également une pénalité de performance. P>
POP () CODE> Vous n'êtes pas intéressé par l'élément sauté. Vous voulez juste que l'effet de suppression de l'élément supérieur. Si la fonction renvoie l'élément et que vous l'ignorez, c'est une copie gaspillée. P>
POP (POP () CODE>, mais les divise plutôt en deux fonctions:
retour () code> (ou
haut () code > Dans le cas de l'adaptateur
std :: pile code> adaptateur) et
pop () code>. La fonction
back () code> renvoie simplement l'élément, tandis que la fonction
pop () code> la supprime simplement. P>
Une fonction qui a deux effets en tant qu'opération atomique unique ne viole pas le principe de la conception logicielle unique.
@Dave Combien de raisons sont là pour changer pour une fonction pop () code> qui supprime et renvoie un élément? Si vous pouvez compter plus d'un, il viole le principe de la responsabilité unique.
@Wilhelm - une exigence de pop () code> pour certaines implémentations de la file d'attente en Java est qu'il fait les deux actions atomique b>.
Le principe de la responsabilité unique concerne la responsabilité des classes ou des composants de votre système, et non des effets des méthodes. Vous pouvez prendre des principes de conception trop loin, vous savez.
La seule raison pour laquelle je peux voir pour utiliser cette syntaxe en C ++: est si vous craignez des copies inutiles. P> Si vous retournez la en réalité, Compilateurs C ++ sont très bons à la copie élision et implémentent presque toujours l'optimisation des valeurs de retour (souvent même lorsque vous compilez avec des optimisations désactivées), ce qui rend le point moot et peut même signifier que la version simple "retour par valeur" devient plus vite em> dans certains cas. p> mais si vous êtes en optimisation prématurée (si vous êtes inquiet em> que le compilateur pourrait ne pas optimiser la copie, même si dans la pratique? EM> em> le faire), vous pourriez discuter de "retourner" paramètres en attribuant un paramètre de référence. P> Plus d'informations ICI P> P> élément code>, il peut em> nécessite une copie supplémentaire de l'objet, qui peut em> être coûteux. p>
imo, une bonne signature pour l'équivalent de la fonction Utiliser les types d'options est le meilleur moyen de renvoyer quelque chose qui peut être disponible ou non. p> p> pop code> de Java en C ++ serait quelque chose comme:
Utiliser c ++ 0x rend le tout fort dur.
comme p> permet de déplacer efficacement l'élément supérieur de la pile. Tandis que p> ne permet pas ces optimisations. P> p>
item = std :: mouvement (pile.top ()); stack.pop (); code> fonctionne efficacement. La chose intéressante à noter est que la principale raison de cette conception en C ++ 03 (sécurité d'exception) n'est plus le cas en C ++ 11 (car les constructeurs de déplacement doivent être sans lancer).