Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1401 connectés 

  FORUM HardWare.fr
  Programmation
  C++

  [C,C++] de l'utilisation des iterateurs avec la STL ??

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[C,C++] de l'utilisation des iterateurs avec la STL ??

n°299531
fykman
Errare Humanum Est
Posté le 02-02-2003 à 18:59:05  profilanswer
 

Salut,
 
Je debute en C++ et je me suis lancé dans l'utilisation de la STL. Seulement j'ai un doute sur l'utilisation des iterateurs.  
 
Un exemple :

Code :
  1. // je rentre 10 valeurs dans un vecteur
  2. vector<int> vect;
  3. for(int i=0;i<10;i++)
  4. vect.push_back(i);
  5. // je veux lire ses valeurs
  6. // 1re façon
  7. for(int i=0; vect.size(); i++)
  8. cout << vect[i];
  9. // 2eme façon
  10. vector<int>::interator iter;
  11. for(iter = vect.begin(); iter != vect.end() ; iter++)
  12. cout << *iter;


 
Voyant qu'il y a deux facons de faire pour lire le vecteur, j'ai d'abord pense que le premiere façon etait plus lente (donc pas bonne).  
Et bien, je me suis amuser à teste les 2 methodes sur de gros vecteurs et je n'ai vu aucune difference en terme de performances.
Alors, pourquoi on peux faire de 2 façons differentes et pourquoi je devrais utiliser des iterateurs (qui allourdissent l'ecriture et la comprehension du code) la ou je peux utiliser une simple boucle sur un indice ??


Message édité par fykman le 02-02-2003 à 19:01:39
mood
Publicité
Posté le 02-02-2003 à 18:59:05  profilanswer
 

n°299539
Taz
bisounours-codeur
Posté le 02-02-2003 à 19:06:40  profilanswer
 

les iterateurs ne ralentissent ni n'alourdissent ni ne compliquent rien du tout: ils sont une manière générique et performante de parcourir et de manipuler des séquences d'objets, indépendamment de la représentation physique de la collection.
 
 
for(iter = vect.begin(); iter != vect.end() ; iter++)  
 
cela dit ceci est le pire exemple de mauvais emploi
 
iter=vect.begin() est OK
iter!vect.end() est tres mauvais car à moins que ta séquence soit modifier, tu appelles vector<T>::end() à chaque itération
iter++, un iterateur n'est pas un pauvre int, donc la post-incrémentation est beaucoup plus couteuse que la pré-incrémenation
 
la bonne ecriture est donc
 
const iterator seq_end(seq.end())
for(iterator i(seq.begin()); i != seq_end; ++i)
 
et à partir de ça tu peux commencer à comparer avec des accès classiques, notemment via index.

n°299544
Captain ad​-hoc
miam les bon batonnets de tux
Posté le 02-02-2003 à 19:13:27  profilanswer
 

fykman a écrit :

Salut,
Alors, pourquoi on peux faire de 2 façons differentes et pourquoi je devrais utiliser des iterateurs (qui allourdissent l'ecriture et la comprehension du code) la ou je peux utiliser une simple boucle sur un indice ??


ça permet d'écrire un algorithme indépendamment de la façon dont sont stockées les données sur lesquelles il travaille: tu peux remplacer ton vector par un deque ou une liste, la version avec iterateurs reste valable alors que la version avec crochets demande au conteneur d'implementer l'accès aléatoire. Si ton algo se contente de parcourir une suite d'elt du premier au dernier, alors il n'y a pas de raison d'imposer au conteneur de fournir un accès direct au ième élément.
 
Dans la pratique... c'est vrai que les itérateurs c'est casse-couille à utiliser, ça a tendance à faire des lignes de 10km de long. Rien que l'ajout du mot-clef typeof au c++ ça améliorerait bien les choses, à mon avis.

n°299548
Taz
bisounours-codeur
Posté le 02-02-2003 à 19:18:30  profilanswer
 

ben les RTTI ca existe déjà via les <typeinfo> et typeid()

n°299554
Captain ad​-hoc
miam les bon batonnets de tux
Posté le 02-02-2003 à 19:26:34  profilanswer
 

++Taz a écrit :

ben les RTTI ca existe déjà via les <typeinfo> et typeid()


 
ouais mais c'est pas ça qui m'emmerde, c'est de devoir écrire
 

Code :
  1. for (std::vector<std::list<machin_truc<plop>::ça_peut_etre_tres_long> >::const_iterator it=x.begin(); ...)

 
plutot que

Code :
  1. for (typeof(x)::const_iterator it=x.begin(); ...)

n°299555
gloop
Posté le 02-02-2003 à 19:32:18  profilanswer
 

Captain ad-hoc a écrit :


 
ouais mais c'est pas ça qui m'emmerde, c'est de devoir écrire
 

Code :
  1. for (std::vector<std::list<machin_truc<plop>::ça_peut_etre_tres_long> >::const_iterator it=x.begin(); ...)

 
plutot que

Code :
  1. for (typeof(x)::const_iterator it=x.begin(); ...)




rien t'empeche de faire des typedef si tu trouves ca trop long

n°299562
Captain ad​-hoc
miam les bon batonnets de tux
Posté le 02-02-2003 à 19:38:25  profilanswer
 

gloop a écrit :


rien t'empeche de faire des typedef si tu trouves ca trop long  


 
Le problème du typedef, c'est justement de donner un nom. Chuis pas toujours inspiré et parfois il vaut mieux pas de nom du tout qu'un nom à la con. Accessoirement, le typeof évite aussi d'avoir à se rappeler du nom. Je n'y vois que des avantages.

n°299568
Taz
bisounours-codeur
Posté le 02-02-2003 à 19:45:54  profilanswer
 

ben faut wrapper et si tu te retrouves à devoir iterer 2 niveaux plus bas, c'est un problème de conception pas de facilité de langage

n°299580
Captain ad​-hoc
miam les bon batonnets de tux
Posté le 02-02-2003 à 20:00:22  profilanswer
 

++Taz a écrit :

ben faut wrapper et si tu te retrouves à devoir iterer 2 niveaux plus bas, c'est un problème de conception pas de facilité de langage


 
Je suis pas d'accord, ponctuellement ça peut arriver que tu ais besoin de vector de vector par ex., ça peut avoir son utilité, le type en lui-même est très explicite (mais trop long pour être tappé plus d'une fois sans devenir chiant) je ne vois pas ce que je gagnerais à tout noyer sous des typedef.

n°299582
Taz
bisounours-codeur
Posté le 02-02-2003 à 20:01:57  profilanswer
 

quand je dis wrapper, je parle pas seulement de typedef

mood
Publicité
Posté le 02-02-2003 à 20:01:57  profilanswer
 

n°299590
Captain ad​-hoc
miam les bon batonnets de tux
Posté le 02-02-2003 à 20:14:50  profilanswer
 

++Taz a écrit :

quand je dis wrapper, je parle pas seulement de typedef


Je ne vois pas ce que tu veux dire alors. J'ai regulièrement besoin de trucs du genre "std::vector< un_type_template< quelque_chose > >" , un bête conteneur quoi, je ne lui demande rien de spécifique, j'ai pas besoin de lui coller un nom ou des fonctionnalités particulières, par contre je passe mon temps à parcourir ses éléments. Comment faut-il faire dans ce cas ?

n°299595
Taz
bisounours-codeur
Posté le 02-02-2003 à 20:20:18  profilanswer
 

ben dans ce cas simple c'est sur qu'il y a que les typedef, mais des que j'ai un niveau de plus, c'est à dire plus qu'une simple colelction d'objet, je trouve toujours moyen de sous-typer et bien définir ces sous-types et leur opérations. ou je fabrique mes propres de itérateurs de A à Z pour pas m'embeter, et ça marche parfaitement (comme par exemple lorsque je veux faire une matrice et que je veux l'itérer)

n°299596
Captain ad​-hoc
miam les bon batonnets de tux
Posté le 02-02-2003 à 20:29:31  profilanswer
 

Ok, je crois qu'en gros on est d'accord alors je vais plutôt aller manger un morceau (mais typeof c'est Bien [:twixy])

n°299810
Musaran
Cerveaulté
Posté le 03-02-2003 à 09:32:03  profilanswer
 

[citation=299562,1][nom]Captain ad-hoc a écrit[/nom]Le problème du typedef, c'est justement de donner un nom. Chuis pas toujours inspiré et parfois il vaut mieux pas de nom du tout qu'un nom à la con. Accessoirement, le typeof évite aussi d'avoir à se rappeler du nom. Je n'y vois que des avantages.[/citationComplètement d'accord, ça devrait exister depuis longtemps !
Remarques, moi je voudrais mieux encore:

Code :
  1. for (auto_type it=x.begin(); ...)

Ça ne me semble pas poser de problème particulier à la cohérence du langage...
 
 
Et dans cette catégorie, j'ai une autre question:
Pourquoi il n'y a pas de surcharges où un conteneur remplace une paire d'itérateurs debut/fin ?

Code :
  1. template<class InIt, class T> InIt find(InIt first, InIt last, const T& val);
  2. template<class Cont, class T> InIt find(Cont cont            , const T& val){
  3. return find(cont.begin(), cont.end(), val);
  4. }

Hein, pourquoi ?
Vu qu'on utilises si souvent les extrémités...


Message édité par Musaran le 03-02-2003 à 09:32:43

---------------
Bricocheap: Montage de ventilo sur paté de mastic silicone

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

  [C,C++] de l'utilisation des iterateurs avec la STL ??

 

Sujets relatifs
[C++] STL map et sortSTL - Comment faire l'équivalent d'un "trim" sur une basic_string
Du C au C++ avec STL: probleme resolu mais non compris[C++]Utilisation de ADO en VISUAL C++
Question utilisation d'un lexique (en html)Utilisation et gestion d'une base de données à distance...
Utilisation de la police "impact"Projet C++ : Création et utilisation d'objets multiples
Utilisation de l'interpréteur Python[J++] question d'utilisation...
Plus de sujets relatifs à : [C,C++] de l'utilisation des iterateurs avec la STL ??


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR