6
votes

Quelle est la différence entre la poussée et le pashift à Perl?

Quelqu'un peut-il s'il vous plaît expliquer pourquoi Pushing se comporte comme indiqué ci-dessous?

En gros, j'essaie d'imprimer des valeurs d'un tableau peuplé par PUSH aussi nonhift .

Lorsque j'essaie d'imprimer le contenu de la matrice peuplée de poussant à l'aide d'index de tableau, il imprime toujours l'élément en haut de la matrice, alors que la matrice remplie de Unshift imprime le contenu du tableau basé sur l'index de la matrice. Je ne comprends pas pourquoi.

avec unshift xxx

sans discussion xxx

/ sans pop / xxx

avec pop xxx


1 commentaires

Vous devez utiliser strict et avertissements . Quel est le i dans impression ("éléments individuels sont:". @Numbers [i]. "\ N"); ? Pourquoi utilisez-vous une tranche de matrice là-bas? Et comment obtenez-vous la sortie que vous montrez de ce script? Oh, et qui a voté cette question? Si tout ce que vous voulez, c'est un badge pour voter sur les questions, le vote, le vote mal posé des questions sur la baisse est également une option valide, vous savez.


5 Réponses :


13
votes

Unshift est utilisé pour ajouter une valeur ou des valeurs sur le début d'un tableau:

fait le contraire d'un shift . Ou l'opposé d'un poussez , en fonction de la façon dont vous le regardez.

Les nouvelles valeurs deviennent alors les premiers éléments du tableau.

poussoir ajoute des éléments à la fin d'un tableau:

traite tableau en tant que pile et appuie les valeurs de la liste à l'extrémité du tableau .


1 commentaires

Merci pour les édits Sinan. C'est définitivement mieux formaté et expliqué maintenant.



28
votes

Vous devez vraiment utiliser utiliser strict; code> et Utiliser des avertissements; code> dans votre code. Les avoir activés vous permettront d'identifier des erreurs dans votre code.

Changez toutes les instances des éléments suivants: p>

foreach Name (@names) code> -> pour mon $ i (@names) code> comme vous ne faites rien avec les éléments du tableau @names code>. p>

@numbers [i] -> Numéros $ [$ I] code> Comme il s'agit d'une erreur non rare d'utiliser une tranche de matrice plutôt que de faire référence à un élément de tableau. P>

Ce n'est pas C. Chaque "variable" doit avoir un sigil ( $ code>, @ code>, % code>, & code> , etc.) devant elle. Que i code> devrait vraiment être $ i code>. P>


comme pour la différence entre appuyez sur code> et Shift code>, la documentation explique: p>

perdoc -f pousser code> : p>

matrice de poussée, liste forte> p>

Tree TreatS Array en tant que pile et appuie les valeurs de la liste sur l'extrémité forte> em> du tableau. La longueur de la matrice augmente par la longueur de la liste. ... renvoie le nombre d'éléments dans la matrice après la "poussée" terminée. P> blockQuote>

perdoc -f nonhift code> : P>

Unshift Array, liste forte> p>

fait le contraire d'un décalage. Ou le contraire d'une poussée, en fonction de la façon dont vous le regardez. Repends Liste sur le avant fort> em> de la matrice et renvoie le nouveau nombre d'éléments dans la matrice. P> blockQuote>


Pour le mettre ASCII-Matitiquement ... P>

        +---------+           +-----------+        +---------+ 
<-----  | ITEM(S) |  ----->   | (@) ARRAY | <----- | ITEM(S) | ----->
 shift  +---------+  unshift  +-----------+  push  +---------+   pop
                              ^           ^
                              FRONT       END


2 commentaires

Grand diagramme. J'aimerais que je puisse +2 ça.


Remarque: dans le contexte de "balançoire de réduction d'analyse", un jeton est "décalé" de l'avant de la matrice contenant la chaîne d'entrée (tokénisée) et elle est "poussée" sur la pile.



7
votes

Cela devrait vraiment être un commentaire, mais c'est trop long pour une boîte de commentaire, alors c'est ici.

Si vous souhaitez illustrer la différence entre Unshift et Push , ce qui suit suffirait: xxx

sortie: xxx

note Utiliser strict; vous protège contre de nombreuses erreurs de programmation et utilise des avertissements; vous avertit lorsque vous utilisez des constructions de valeur douteuse. À votre niveau, ni optionnel.


0 commentaires

0
votes

Notez que

Le tableau préallocate est équilibré vers l'extrémité de la matrice (ce qui signifie qu'il y a plus d'espace libre à l'extrémité extrême de la liste que avant l'élément de la liste). Ceci est fait à dessein sur pour faire des pousses plus efficaces que les sans-frères . http://www.perlmonks.org/?node_id=17890

Bien que listes font assez bien comme "Perl est codé intelligemment car l'utilisation de listes comme des files d'attente a été anticipée (ibid.)" . .

Pour comparaison, dans divers moteurs JavaScript Shift / Dushift sur les tableaux semble être significativement plus lent .


0 commentaires

0
votes

Je n'ai vu aucune articulation de ce que ces méthodes font réellement en termes de complexité opérationnelle, ce qui me permet de me a aidé à conceptualiser: Quintessentiellement, je crois que cela s'appelle "Shift" car il doit réellement changer tout le n éléments de votre réseau à de nouveaux indices afin de mettre à jour correctement la propriété de longueur.

Push () et POP () Utilisez une complexité opérationnelle plus simple. Peu importe le nombre de n valeurs dans votre matrice, ou votre groupe.length, poussoir ou POP exécutera toujours une opération. Il n'a pas besoin de faire face aux index, il n'a pas besoin de itérer, il n'a pas besoin d'exécuter une opération, toujours à la fin de la pile, en ajoutant ou en supprimant une valeur et une index.

Plus important encore, remarquez lorsque vous utilisez Push / POP, que les autres éléments de la matrice ne sont pas affectés - ce sont les mêmes valeurs dans les mêmes indices de votre tableau. La longueur de la matrice est également automatiquement mise à jour correctement à ce que vous vous attendez lors de l'élimination ou de l'ajout de valeurs.

D'autre part, SHIFT () et Dushift () Non seulement Ajoutez ou supprimez, mais également à "déplacer" tous les autres éléments de votre réseau en différents indices. Ceci est plus complexe et prend plus de temps car la quantité d'opérations dépend de n, le nombre d'éléments de votre tableau ou une gamme.Longueur. Pour chaque n + 1 plus grand, il doit faire 1 autre opération pour décaler chacune des valeurs dans l'index correct, à la mise à jour correctement de la longueur.

Sinon, si cela n'a pas exécuté N Opérations après Maj () et déplacez les autres éléments, vous n'auriez aucun élément à l'index 0, et cela ne changerait pas la longueur de votre tableau, n'est-ce pas? Nous voulons que la longueur de nos matrices se met à jour intuitivement et que vous changez et que le décalage doit exécuter davantage d'opérations pour accomplir cela.


0 commentaires