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

  FORUM HardWare.fr
  Programmation
  C++

  [C++] les iterateurs STL

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[C++] les iterateurs STL

n°303357
fykman
Errare Humanum Est
Posté le 06-02-2003 à 18:12:13  profilanswer
 

Salut,
 
Deux questions sur les iterateurs :
Je voudrais recuperer l'iterateur d'un object dans un vecteur, les codes suivants sont t'ils corrects :
 

Code :
  1. Toto *t;
  2. vector<Toto*> vect;
  3. vector<Toto*>::iterateur it;
  4. it = vect.end();
  5. vect.push_back(t);


 
ou  
 

Code :
  1. Toto *t;
  2. vector<Toto*> vect;
  3. vector<Toto*>::iterateur it;
  4. vect.push_back(t);
  5. it = vect.end()-1;


 
et ensuite je voudrais savoir si en elevant un element d'un vecteur les iterateurs des autres element du vecteur sont modifiés. Par exemple :  
j'ai un vecteur de 100 elements, j'ai un iterateur qui pointe sur le 50eme element que je garde dans un coin. Si je retire (avec erase) le 25ème element; la liste d'elements va se decaler de 1 a gauche mais est-ce que l'iterateur que j'avais gardé seras toujours valable ??

mood
Publicité
Posté le 06-02-2003 à 18:12:13  profilanswer
 

n°303384
Kristoph
Posté le 06-02-2003 à 19:09:21  profilanswer
 

Les iterateurs sur un vecteur sont invalidés quand tu ajoute ou retire un element avant cet iterateur.
 
invalidé ne veux pas dire que ca plante ou que ca te previens !

n°303388
HelloWorld
Salut tout le monde!
Posté le 06-02-2003 à 19:19:57  profilanswer
 

(précision :)) ca veut dire qu'il faut pas compter dessus car le comportement va changer d'une implémentation à l'autre.
Pour le dernier, c'est end() - 1 qu'il faut utiliser (end() pointe sur la fin, soit apres le dernier element )
Pour avoir le dernier element, tu peux utiliser back() (mais c'est pas un iterator ...)
Un exemple ici :
http://msdn.microsoft.com/library/ [...] ample).asp
et le ref ici :
http://www.sgi.com/tech/stl/


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
n°303394
fykman
Errare Humanum Est
Posté le 06-02-2003 à 19:23:28  profilanswer
 

Kristoph a écrit :

Les iterateurs sur un vecteur sont invalidés quand tu ajoute ou retire un element avant cet iterateur.
 
invalidé ne veux pas dire que ca plante ou que ca te previens !


 
Ok, ben alors je suis niqué.... :/

n°303402
gloop
Posté le 06-02-2003 à 19:27:36  profilanswer
 

HelloWorld a écrit :

(précision :)) ca veut dire qu'il faut pas compter dessus car le comportement va changer d'une implémentation à l'autre.
Pour le dernier, c'est end() - 1 qu'il faut utiliser (end() pointe sur la fin, soit apres le dernier element )
Pour avoir le dernier element, tu peux utiliser back() (mais c'est pas un iterator ...)
Un exemple ici :
http://msdn.microsoft.com/library/ [...] ample).asp
et le ref ici :
http://www.sgi.com/tech/stl/


 
effectivement, end () pointe après la fin, mais end ()-1 n'est pas forcément une bonne idée.
tu peux utiliser rbegin () qui te renvoie alors un reverse_iterator (tu peux récupérer l'iterator pointant sur le même élément avec la méthode base () sur le reverse_iterator)

n°303527
fykman
Errare Humanum Est
Posté le 06-02-2003 à 23:44:38  profilanswer
 

Kristoph a écrit :

Les iterateurs sur un vecteur sont invalidés quand tu ajoute ou retire un element avant cet iterateur.
 
invalidé ne veux pas dire que ca plante ou que ca te previens !


 
Et si j'utilise une liste a la place d'un vecteur, l'iterateur seras aussi invalidé ou non ?

n°303618
Musaran
Cerveaulté
Posté le 07-02-2003 à 04:36:42  profilanswer
 

fykman a écrit a écrit :

Je voudrais recuperer l'iterateur d'un object dans un vecteur, les codes suivants sont t'ils corrects :


Seul le deuxième est universel.
Le premier n'est bon que pour vector, et à condition de lui avoir fait réserver la mémoire (reserve) au préalable.
 
Au fait, c'est iterator dans un source.
 

fykman a écrit a écrit :

Et si j'utilise une liste a la place d'un vecteur, l'iterateur seras aussi invalidé ou non ?


Non.
 
 

Kristoph a écrit a écrit :

Les iterateurs sur un vecteur sont invalidés quand tu ajoute ou retire un element avant cet iterateur.


Ajoutes ou retires tout court, vu que s'il y a réallocation c'est l'ensemble qui est concerné.
 
 

gloop a écrit a écrit :

effectivement, end () pointe après la fin, mais end ()-1 n'est pas forcément une bonne idée.


Parce que + ou - équivalent à un accès aléatoire, ce qui marche avec un vector, mais pas avec tous les conteneurs.
Ceci est universel:

Code :
  1. it = vect.end();
  2. --it;
  3. it = vect.rbegin().base(); //ou l'exemple de gloop


Message édité par Musaran le 08-02-2003 à 03:15:52

---------------
Bricocheap: Montage de ventilo sur paté de mastic silicone
n°303686
fykman
Errare Humanum Est
Posté le 07-02-2003 à 10:06:29  profilanswer
 

Ok cette fois j'ai bien capté....
 
Merci a tous pour votre aide  :hello:

n°304068
fykman
Errare Humanum Est
Posté le 07-02-2003 à 17:24:04  profilanswer
 

Bon, je suis en train de devenir dingue avec ces iterateurs  :pt1cable:  
 
voici mon code :
 

Code :
  1. Foo *foo = new Foo();
  2. list<Foo*> lst;
  3. list<Foo*>::iterator it;
  4. lst.push_back(foo);
  5. it = lst.end;
  6. --it;
  7. foo->it = it;


 
et ca ne marche pas, l'iterateur it que je recupere est invalide
 
je comprends plus rien....
 
 

n°304115
HelloWorld
Salut tout le monde!
Posté le 07-02-2003 à 18:34:30  profilanswer
 

ben si tu as bien lu on te dit que c'est normal ... end() ne pointe pas sur le dernier element, mais sur la fin du tableau, soit apres le dernier element, soit sur rien de bon.


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
mood
Publicité
Posté le 07-02-2003 à 18:34:30  profilanswer
 

n°304122
gloop
Posté le 07-02-2003 à 18:42:58  profilanswer
 

HelloWorld a écrit :

ben si tu as bien lu on te dit que c'est normal ... end() ne pointe pas sur le dernier element, mais sur la fin du tableau, soit apres le dernier element, soit sur rien de bon.


Si tu avais lu le post de Musaran, tu aurais vu que:
 

Code :
  1. it = vect.end();
  2. --it;

 
est légal, et que it pointe alors sur le dernier élement du conteneur

n°304237
fykman
Errare Humanum Est
Posté le 07-02-2003 à 21:37:19  profilanswer
 

Desolé fausse alerte, en fait ca marche maintenant, le probleme venait d'une autre partie de mon programme.
 
En fait , j'ai pensé que le bug venait de la, parce le debugger de VC6 ne m'affiche pas le contenu d'un iterateur sur la liste alors qu'il affiche correctement le contenu d'un iterateur de vecteur... va comprendre... [:spamafote]


Message édité par fykman le 07-02-2003 à 21:38:54

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

  [C++] les iterateurs STL

 

Sujets relatifs
[C,C++] de l'utilisation des iterateurs avec la STL ??[C++] STL map et sort
STL - Comment faire l'équivalent d'un "trim" sur une basic_stringDu C au C++ avec STL: probleme resolu mais non compris
[STL] fonctions adaptees a mes besoins ????[STL] vector/list de structures, recherche d'elements de la structure
des ptites questions sur la STL et sur stringVitesse d'execution de code STL sous VisualC++ !?!?
Librairies statiques, sousprojets et STL 
Plus de sujets relatifs à : [C++] les iterateurs STL


Copyright © 1997-2025 Groupe LDLC (Signaler un contenu illicite / Données personnelles)