En quoi l'implémentation d'Iterator en Java est-elle différente de celle en C++?Quelle est la différence entre les itérateurs en Java et C++?
Répondre
Dans la bibliothèque standard C++ (98) actuelle (en particulier la partie anciennement appelée STL) définit une forme d'itérateurs qui sont très proches des pointeurs C (y compris l'arithmétique). En tant que tels, ils pointent juste quelque part. Pour être utile, vous avez généralement besoin de deux pointeurs pour pouvoir parcourir entre eux. Je comprends que C++ 0x introduit des plages qui agissent plus comme des itérateurs Java.
Java a introduit l'interface Iterator
(et ListIterator
) dans la version 1.2, prenant largement le relais de la version plus verbeuse Enumerable. Java n'a pas d'arithmétique de pointeur, il n'est donc pas nécessaire de se comporter comme un pointeur. Ils ont une méthode hasNext
pour voir s'ils vont à la fin, au lieu de nécessiter deux itérateurs. L'inconvénient est qu'ils sont moins flexibles. Le système requiert des méthodes comme subList
plutôt que d'itérer entre deux itérateurs sont des points spécifiques dans la liste contenant. Une différence générale dans le style est que tandis que C++ utilise le "polymorphisme statique" à travers des templates, Java utilise des interfaces et le polymorphisme dynamique commun.
Le concept des itérateurs est de fournir la colle pour permettre la séparation de "l'algorithme" (flux de contrôle vraiment) et du conteneur de données. Les deux approches le font raisonnablement bien. Dans des situations idéales, le code "normal" devrait à peine voir les itérateurs.
Je ne pensais pas qu'il y aurait une bonne réponse à cette question, mais celle-ci en est une. +1 –
La bibliothèque standard "C++ (97)" n'existe pas. La norme C++, décrite dans la norme ISO 14882, est apparue en 1998 et a été mise à jour en 2003. Elle ne définit nulle part comment les itérateurs sont implémentés, mais spécifie bien sûr l'interface qu'ils fournissent. –
Il définit précisément comment le * concept * des itérateurs sont mis en œuvre. Ce qui semble être la question. –
C++ ne spécifie pas comment les itérateurs sont implémentés. Il spécifie cependant leur interface et le comportement minimal qu'ils doivent fournir pour fonctionner avec d'autres composants de la bibliothèque standard.
Par exemple, pour les itérateurs d'entrée, la norme spécifie qu'un itérateur doit être déréférencé via l'opérateur *. Il ne précise cependant pas comment cet opérateur doit être mis en œuvre.
C'est tout le problème de la surcharge de l'opérateur. – Malfist
Java ne spécifie pas non plus; Iterator
La bibliothèque C++ (la partie anciennement appelée STL) est très précise quant à la définition du concept d'itérateur. –
Les implémentations sont définies entièrement par les fournisseurs de bibliothèques/fournisseurs JRE standard en C++/Java respectivement. Ils sont libres de les mettre en œuvre comme ils le souhaitent, tant que leur comportement est conforme aux normes respectives.
C'est vraiment une application différente du mot implémenté. –
Les itérateurs C++ (STL) essaient d'imiter autant que possible la syntaxe du pointeur, via une surcharge de l'opérateur.
La spécification standard définit les différents concepts de l'itérateur (par exemple, accès direct, bidirectionnel, accès aléatoire, entrée, sortie). Chaque concept doit correspondre à une interface spécifique (par exemple, l'opérateur ++ pour l'itérateur avant pour passer à l'élément suivant dans l'ordre, - pour bidirectionnel, +, + = pour l'accès aléatoire, etc.).
En C++, vous voyez des personnes circuler autour des itérateurs tout le temps. Les itérateurs C++ "pointent" vers un élément spécifique d'un conteneur. Vous pouvez déréférencer un itérateur pour obtenir l'élément (et vous pouvez le faire encore et encore). Vous pouvez effacer l'élément auquel un itérateur fait référence de manière efficace. Vous pouvez également faire des copies d'un itérateur (soit en assignant à une autre variable, soit en passant un itérateur par valeur à une fonction) pour garder une trace de plusieurs endroits en même temps. Les itérateurs en C++ peuvent être "invalidés" par certaines opérations sur le conteneur, en fonction du conteneur. Lorsqu'un itérateur devient invalidé (les règles peuvent être complexes), les opérations avec l'itérateur ont un comportement indéfini et peuvent (de façon incohérente) planter votre programme ou retourner des résultats incorrects; bien que dans certaines structures de données (par exemple std::list
), les itérateurs restent valides à travers la plupart des modifications du conteneur.
En Java, vous ne voyez pas ce type d'utilisation. Un itérateur dans Java pointe "entre" deux éléments, plutôt que "à" un élément.La seule façon d'obtenir des éléments avec un itérateur est de le déplacer vers l'avant pour obtenir l'élément que vous avez déplacé. Bien sûr, cela change l'état de l'itérateur, et vous ne pouvez pas revenir en arrière; sauf si vous avez un ListIterator
auquel cas vous pouvez vous déplacer à la fois vers l'avant et vers l'arrière (mais il est toujours ennuyeux de devoir avancer et reculer juste pour rester immobile). Vous ne pouvez pas copier un itérateur, car l'interface n'expose pas une méthode de copie publique. par exemple, vous ne pouvez pas simplement passer un marqueur d'un emplacement spécifique à une fonction, sans donner à cette fonction une référence au même itérateur que vous avez, et ainsi leur permettre de changer l'état de votre itérateur. En Java, un itérateur sera invalidé (au moins dans les conteneurs standard) par toute modification du conteneur sauf par les méthodes add()
ou remove()
de l'itérateur, ce qui est trop conservateur (par exemple, la plupart des modifications sur un LinkedList
ne devraient pas affecter un itérateur). Lorsque vous essayez d'utiliser un itérateur invalidé, il soulève ConcurrentModificationException
(nommé de manière confuse parce qu'il n'a rien à voir avec Concurrency) au lieu de provoquer un comportement indéfini, ce qui est bien.
- 1. Quelle est la différence entre 'int?' et 'int' en C#?
- 2. Quelle est la différence entre read et readline en C#?
- 3. Quelle est la différence entre% c et% C dans printf?
- 4. Quelle est la différence entre C et Embedded C?
- 5. Quelle est la différence entre dict() et {}?
- 6. Quelle est la différence entre memset et memcpy dans C
- 7. quelle est la différence entre:.! et: r !?
- 8. Quelle est la différence entre = et: =
- 9. Quelle est la différence entre ces déclarations en C?
- 10. Quelle est la différence entre les compléments et les macros?
- 11. Quelle est la différence entre AppDomain.CurrentDomain.BaseDirectory et Application.ExecutablePath en pratique?
- 12. Quelle est la différence entre les schémas W3 et xmlsoap.org?
- 13. Quelle est la différence entre « et" en JavaScript?
- 14. Quelle est la différence entre les méthodes anonymes (C# 2.0) et les expressions lambda (C# 3.0)?
- 15. Quelle est la différence entre JAIN SIP et MJSIP?
- 16. Quelle est la différence entre le flux de fichiers en C et iostream en C++?
- 17. Quelle est la différence entre "someValuesFrom" et "allValuesFrom"?
- 18. Quelle est la différence entre exit() et abort()?
- 19. Quelle est la différence entre "bool" et "bool?"
- 20. Quelle est la différence entre -ggdb gcc et -g gcc
- 21. Quelle est la différence entre? et Object dans les génériques Java?
- 22. Quelle est la différence entre IEnumerator et IEnumerable?
- 23. Quelle est la différence entre nohup et un démon?
- 24. Quelle est la différence entre session.Merge et session.SaveOrUpdate?
- 25. Quelle est la différence entre latin1_general_ci et utf8_bin dans MYSQL
- 26. Quelle est la différence entre un assistant et un partiel?
- 27. Quelle est la différence entre include et extend dans Ruby?
- 28. Quelle est la différence entre 'form_for @ecard' et 'form_for: ecard'?
- 29. Quelle est la différence entre le format OMF et COFF?
- 30. Quelle est la différence entre propriétaire et utilisateur (WindowsIdentity)?
vous devez être plus explicite avec votre question. Quel est exactement votre problème? –
peut-être vous aimez lire celui-ci: http://doc.trolltech.com/qq/qq12-qt4-iterators.html et celui-ci http://doc.trolltech.com/4.5/containers.html#the-iterator -classes –
@litb vient de finir de lire ça !! – yesraaj