267 votes

Pourquoi utiliser les itérateurs plutôt que les indices de tableau ?

Prendre les deux lignes de code suivantes :

Et ceci :

On me dit que la seconde manière est préférable. Pourquoi exactement est-ce ?

232voto

wilhelmtell Points 25504

La première forme est efficace seulement si le vecteur.size() est une opération rapide. Cela est vrai pour les vecteurs, mais pas pour les listes, par exemple. Aussi, qu'allez-vous faire dans le corps de la boucle? Si vous prévoyez sur l'accès à des éléments comme dans

T elem = some_vector[i];

ensuite, vous êtes dans l'hypothèse où le conteneur a operator[](std::size_t) défini. Encore une fois, cela est vrai pour les vecteurs, mais pas pour d'autres conteneurs.

L'utilisation des itérateurs de vous rapprocher contenant de l'indépendance. Vous n'êtes pas de faire des hypothèses sur random-access capacité ou rapide, size() opération, seulement que le récipient a itérateur capacités.

Vous pouvez améliorer votre code en utilisant des algorithmes standard. En fonction de ce que vous essayez d'atteindre, vous pouvez choisir d'utiliser std::for_each(), std::transform() et ainsi de suite. À l'aide d'un algorithme standard plutôt qu'explicite d'une boucle que vous êtes en évitant de réinventer la roue. Votre code est susceptible d'être plus efficace (compte tenu de l'algorithme de droite est choisi), la correction et réutilisables.

57voto

Mark Ransom Points 132545

C'est une partie du C++ moderne endoctrinement processus. Les itérateurs sont le seul moyen pour parcourir la plupart des conteneurs, de sorte que vous l'utiliser même avec des vecteurs juste pour obtenir vous-même dans le bon état d'esprit. Sérieusement, c'est la seule raison pour laquelle je le fais - je ne pense pas que j'ai jamais remplacé un vecteur avec un autre type de conteneur.


Wow, c'est encore downvoted au bout de trois semaines. Je suppose qu'il ne paie pas d'être un peu pince-sans-rire.

Je pense que l'index de tableau est plus lisible. Elle correspond à la syntaxe utilisée dans d'autres langues, et la syntaxe utilisée pour l'ancienne C des tableaux. Il est également moins verbeux. L'efficacité doit être un lavage si votre compilateur est tout bon, et il ya peu de cas où il questions de toute façon.

De même, je continue de me retrouver à l'aide des itérateurs fréquemment avec les vecteurs. Je crois que l'itérateur est un concept important, donc je le promouvoir dès que je peux.

53voto

cruizer Points 4821

parce que vous n'êtes pas attachant votre code à l’application particulière de la liste de some_vector. Si vous utilisez les indices de tableau, il faut avoir une certaine forme de tableau ; Si vous utilisez des itérateurs, vous pouvez utiliser ce code sur n’importe quelle implémentation de liste.

35voto

asterite Points 3218

Imaginez some_vector est mis en œuvre avec une liste liée. Ensuite, la demande d'un élément dans le i-ème lieu exige de, des activités à faire la traversée de la liste de nœuds. Maintenant, si vous utilisez itérateur, d'une manière générale, il fera de son mieux pour être aussi efficace que possible (dans le cas d'une liste chaînée, il sera de maintenir un pointeur vers le nœud courant et le faire progresser à chaque itération, nécessitant seulement une seule opération).

Il dispose de deux choses:

  • L'Abstraction d'utilisation: vous voulez juste pour itérer certains éléments, vous ne se soucient pas comment le faire
  • Performance

27voto

Chad Points 1596

Je vais être le défenseur des diables, et de ne pas recommander les itérateurs. La raison principale pourquoi, tout le code source est j'ai travaillé à partir du Bureau de développement d'applications pour le développement d'un jeu ai-je ni ai-je besoin pour utiliser des itérateurs. Toutes les fois qu'ils n'ont pas été tenus et, deuxièmement, les hypothèses cachées et le code de désordre et de débogage des cauchemars, vous obtenez avec les itérateurs en faire un premier exemple de ne pas l'utiliser dans les applications qui nécessitent de la vitesse.

Même à partir d'un maintence point ils sont un gâchis. Ses pas à cause d'eux, mais à cause de toutes les aliasing qui se passent derrière la scène. Comment puis-je savoir que vous n'avez pas mis en œuvre de votre propre espace de vecteur ou d'une matrice, liste qui fait quelque chose de complètement différent de normes. Puis-je savoir de quel type est actuellement maintenant en cours d'exécution? Avez-vous de surcharge d'un opérateur je n'ai pas eu le temps de vérifier tout votre code source. L'enfer je ne sais même pas quelle version de la STL de votre aide?

Le prochain problème que vous avez obtenu avec les itérateurs est l'abstraction qui fuit, mais il existe de nombreux sites internet qui traitent en détail de la question avec eux.

Désolé, je n'ai pas et n'ai pas encore vu tout moment dans les itérateurs. Si ils abstraite de la liste ou un vecteur loin de vous, quand en fait il faut savoir déjà ce que vecteur ou votre liste à faire si vous n'avez pas, alors vous allez juste être vous-même la mise en place pour quelques sessions de débogage dans l'avenir.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X