Pointeur sur un élément d'un std::vector

Pointeur sur un élément d'un std::vector - C++ - Programmation

Marsh Posté le 25-07-2004 à 15:19:33    

Je rencontre un petit problème avec l'utilisation des std::vector.
J'aimerais avoir un pointeur vers un élément d'un std::vector. Le problème c'est que, si je rajoute des éléments au vector, il risque d'y avoir une réallocation et donc, tous les éléments auront changer d'adresse. Mon pointeur pointera donc vers une adresse incorrecte.
 
Voilà du code pour illustrer le problème:

Code :
  1. #include <vector>
  2. int main(int argc, char *argv[])
  3. {
  4. unsigned int i;
  5. std::vector<int> MonVector;
  6. for (i = 0; i < 5; i++)
  7.  MonVector.push_back(2);
  8. int *Ptr = &MonVector[3];
  9. //Le pointeur pointe bien sur le 4eme element du vector
  10. printf("%d\n", *Ptr);
  11. for (i = 0; i < 150; i++)
  12.  MonVector.push_back(18);
  13. //Le pointeur pointe vers une zone mémoire incorrecte
  14. printf("%d\n", *Ptr);
  15. return 0;
  16. }


 
Comment je pourrais faire pour résoudre ce problème?

Reply

Marsh Posté le 25-07-2004 à 15:19:33   

Reply

Marsh Posté le 25-07-2004 à 15:25:51    

tu ne fais pas. les modifications de séquences invalident les itérateurs dessus.
 
2 solutions :
- dimensionner une bonne fois pour tout ton vector
- faire une classe proxy, qui garde une référence sur ce vector et un indice

Reply

Marsh Posté le 25-07-2004 à 15:28:09    

Citation :

A vector's iterators are invalidated when its memory is reallocated. Additionally, inserting or deleting an element in the middle of a vector invalidates all iterators that point to elements following the insertion or deletion point. It follows that you can prevent a vector's iterators from being invalidated if you use reserve() to preallocate as much memory as the vector will ever use, and if all insertions and deletions are at the vector's end.


http://www.sgi.com/tech/stl/Vector.html

Reply

Marsh Posté le 25-07-2004 à 15:47:53    

Merci pour vos réponses :)
 
Je ne peux pas garder seulement l'indice car je n'ai plus accès au vector après et puis si j'enlève un élément en début de vector, il faudrait décaler tous les indices. Je pensais qu'il y avait une sorte d'itérateur qui se mettait à jour à chaque réallocation mais d'après la citation de verdoux, ça n'existe pas.
Et puis je ne peux pas dimensionner le vector une bonne fois pour toute car j'ai besoin de rajouter/enlever des éléments fréquemment.
 
Donc je vais continuer à faire comme je faisais avant, c'est à dire un std::vector<int *> mais ça me fait chier car je vais être obliger de me trimbaler un constructeur de copie et un operateur =.
Enfin, si quelqu'un à une meilleure solution je suis preneur.


Message édité par _momone_ le 25-07-2004 à 15:49:34
Reply

Marsh Posté le 25-07-2004 à 15:57:01    

peut-être utiliser std::list ?


---------------
-( BlackGoddess )-
Reply

Marsh Posté le 25-07-2004 à 15:59:18    

Je peux pas, mes éléments doivent être les uns à la suite des autres en mémoire.

Reply

Marsh Posté le 25-07-2004 à 16:12:46    

std::vector<int *>
 
ça te coute 2x plus de mémoire

Reply

Marsh Posté le 25-07-2004 à 16:25:48    

Ouaip enfin je le fais pas avec des int mais avec des objets plus gros. Le int c'était pour l'exemple.
Si tu as une meilleure solution à me proposer, je prend. Jai pas vraiment compris ton idée de proxy...

Reply

Marsh Posté le 25-07-2004 à 16:38:35    

t'as besoin de faire quoi avec ta structure de données ?

Reply

Marsh Posté le 25-07-2004 à 16:41:17    

parce que là je comprends pas, tu dis que tu as besoin de contiguité mais qu'une indirection ça te va ...

Reply

Marsh Posté le 25-07-2004 à 16:41:17   

Reply

Marsh Posté le 25-07-2004 à 17:01:04    

En fait, ouais, j'ai pas vraiment besoin de contiguité. Donc je vais utiliser std::list.
 
Merci pour vos réponses ;)


Message édité par _momone_ le 25-07-2004 à 17:01:19
Reply

Marsh Posté le 25-07-2004 à 17:06:26    

tu as aussi std::map où tu accèdes aux données par une clef.

Reply

Marsh Posté le 29-09-2004 à 15:20:26    

Et le map ne réalloue pas tout à chaque fois ?

Reply

Marsh Posté le 29-09-2004 à 15:22:12    

je suis moi même confronté à ce genre de probleme, sachant qu'en plus chaque élément de mon vecteur contient lui même un vecteur ... et que je suis sencé mémorisé les adresses des éléments du sous-vecteur ...
De plus, je dois pouvoir lister tout le "tableau" sans connaitre "l'index" ...

Reply

Marsh Posté le 29-09-2004 à 16:56:08    

si ça invalide également. si tu ne peux pas mémoriser les adresses physiques parce qu'elle change, mémorise un autre identifiant ou fait en sorte qu'elles ne changent pas

Reply

Sujets relatifs:

Leave a Replay

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