47 votes

Les itérateurs C ++ considérés comme nuisibles?

Dans les Bibliothèques Boost C++ de la bibliothèque de la conférence, aujourd'hui, Andrei Alexandrescu auteur du livre Modern C++ Design et le Loki de la bibliothèque C++ , a parlé au sujet de pourquoi les itérateurs sont mauvais, et qu'il avait une meilleure solution.

J'ai essayé de lire les diapositives de la présentation, mais je ne pouvais pas sortir grand chose d'eux.

  1. Sont des itérateurs mauvais?
  2. Est son remplaçant vraiment mieux?
  3. Va C++ implementators ramasser ses idées?

(EDIT: Supprimé boostcon lien; domaine dépassé par les spammeurs)

40voto

Konrad Rudolph Points 231505

Tout d'abord, pour répondre à vos questions:

  1. Pas de. En fait, je l'ai soutenu ailleurs que les itérateurs sont les plus importants et fondamentaux du concept de l'informatique jamais. J' (contrairement à Andrei) pensent également que les itérateurs sont intuitives.
  2. Oui, certainement, mais qui ne devrait pas venir comme une surprise.
  3. Hmm. Regarder coup de pouce.Gamme et C++0x – n'ont-ils pas déjà?

Andrei contribution importante ici est juste de dire: abandon de la notion de itérateurs tout à fait, voir plages non pas seulement comme une commodité wrapper, mais plutôt comme un noyau de construire. D'autres langues ont déjà fait (beaucoup Andrei concepts juste écho .NET, LINQ ou Python itérateurs), mais ils ont tous offrent seulement les plages de sortie. Andrei plaide pour différents types de gammes, comme les classiques itérateur catégories.

Dans cette perspective, il est étrange qu'il commence par se moquer du caractère arbitraire de ces itérateur catégories.

Je pense aussi que ses exemples sont éteintes, surtout son fichier de la copie: oui, l'itérateur variante est une énorme amélioration par rapport à l'1975 code. Il réduit une boucle compliquée avec condition d'arrêt vers le bas pour une déclaration. De quoi il est vraiment question ici est juste la syntaxe. Eh bien, excusez-moi: nous parlons de C++ ici – bien sûr, la syntaxe est laid. Et oui, à l'aide de plages ici est une amélioration, mais seulement du point de vue syntaxique.

Je pense aussi que Andrei find mise en œuvre est à l'arrêt. Ce qu'il définit réellement il y a l' DropUntil de l'opération (la dénomination est dur!) à partir de LINQ. L' find opération devrait vraiment revenir un ou zéro des éléments (ou un itérateur!). Fuir les itérateurs ici n'est pas utile à mon avis car on peut vouloir modifier directement la valeur au lieu de le copier. Retour d'un élément de la gamme seulement ajoute de la surcharge sans avantage. Faire Andrei chemin est mauvais, car alors le nom de la méthode est tout simplement faux et trompeur.

Cela dit, je suis simplement d'accord avec Andrei dans presque tous les points. Les itérateurs, tout en étant mon animal de compagnie le concept de l'informatique, sont certainement un grand syntaxiques de charge et de nombreuses plages (surtout infinie générateurs) peut (et doit) être mis en œuvre facilement sans eux.

4voto

Daniel Daranas Points 15123
  1. La plupart d’entre nous en font un usage simple dans des idiomes bien connus, comme dans les boucles for itérer dans un std :: vector. Un développeur le lit et sait ce qui se passe. Dans notre vie quotidienne de codage, les itérateurs ne sont ni bons ni mauvais, ils sont simplement "ce qui fait le travail".
  2. Probablement oui.
  3. Je ne pense pas.

4voto

MSalters Points 74024

Andrei à la fois peut être un peu provocateur. Les itérateurs sont raisonnables concept, et tout à fait fondamental dans le sens où les bits sont. Mais comme la plupart des bits en C++ ne sont pas des booléens, mais une partie de la plus grande des types,la plupart des itérateurs devrait être traitée à un niveau élevé. Andrei est un droit que le niveau approprié de le faire est l'objet de la plage. Mais pas toutes les gammes sont correctement exposées que d'itérateur de gammes, comme les istream_iterator sentinelle montre. C'est juste un hack pour créer une artificielle fin de l'itérateur. Je ne pense pas que ses idées seront reprises par les implémentations, cependant. C++1x sera aussi pertinent que le C99.

3voto

James Hopkin Points 8318

C ++ 0x est déjà en train de faire les premiers pas:

  • Les références rvalue résolvent certains problèmes de traitement des conteneurs en tant que plages
  • des plages ont été ajoutées à la bibliothèque principale, y compris des concepts de plage

Passer aux plages sans perdre aucune fonctionnalité d'itérateur (pensez à toutes les combinaisons de catégories d'itérateurs, const-ness et rvalue-ness) est difficile, surtout si vous essayez de prendre en compte des plages infinies et modifiables.

3voto

Brian Points 82719

Je conviens avec lui que les itérateurs sont généralement inférieurs aux plages, et je ne sais pas si «quelque chose de mieux» sera repris.

"Le bien est l'ennemi du meilleur" est ici en jeu, comme d'habitude. Les itérateurs sont utiles et solidement enracinés, il est donc difficile de savoir si quelque chose de mieux, comme des plages, peut les supplanter dans un laps de temps raisonnable.

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