les iterateurs STL [C++] - C++ - Programmation
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 !
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/
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. |
Ok, ben alors je suis niqué....
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. |
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)
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. |
Et si j'utilise une liste a la place d'un vecteur, l'iterateur seras aussi invalidé ou non ?
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 :
|
Marsh Posté le 07-02-2003 à 10:06:29
Ok cette fois j'ai bien capté....
Merci a tous pour votre aide
Marsh Posté le 07-02-2003 à 17:24:04
Bon, je suis en train de devenir dingue avec ces iterateurs
voici mon code :
Code :
|
et ca ne marche pas, l'iterateur it que je recupere est invalide
je comprends plus rien....
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.
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 :
|
est légal, et que it pointe alors sur le dernier élement du conteneur
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...
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 :
ou
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 ??