[C++] les iterateurs STL

les iterateurs STL [C++] - C++ - Programmation

Marsh Posté le 06-02-2003 à 18:12:13    

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 ??

Reply

Marsh Posté le 06-02-2003 à 18:12:13   

Reply

Marsh Posté le 06-02-2003 à 19:09:21    

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 !

Reply

Marsh Posté le 06-02-2003 à 19:19:57    

(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
Reply

Marsh Posté le 06-02-2003 à 19:23:28    

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é.... :/

Reply

Marsh Posté le 06-02-2003 à 19:27:36    

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)

Reply

Marsh Posté le 06-02-2003 à 23:44:38    

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 ?

Reply

Marsh Posté le 07-02-2003 à 04:36:42    

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
Reply

Marsh Posté le 07-02-2003 à 10:06:29    

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

Reply

Marsh Posté le 07-02-2003 à 17:24:04    

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....
 
 

Reply

Marsh Posté le 07-02-2003 à 18:34:30    

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
Reply

Marsh Posté le 07-02-2003 à 18:34:30   

Reply

Marsh Posté le 07-02-2003 à 18:42:58    

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

Reply

Marsh Posté le 07-02-2003 à 21:37:19    

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
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed