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

  FORUM HardWare.fr
  Programmation
  C++

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

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

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

n°805700
_momone_
Posté le 25-07-2004 à 15:19:33  profilanswer
 

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?

mood
Publicité
Posté le 25-07-2004 à 15:19:33  profilanswer
 

n°805702
Taz
bisounours-codeur
Posté le 25-07-2004 à 15:25:51  profilanswer
 

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

n°805704
verdoux
And I'm still waiting
Posté le 25-07-2004 à 15:28:09  profilanswer
 

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

n°805711
_momone_
Posté le 25-07-2004 à 15:47:53  profilanswer
 

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
n°805716
blackgodde​ss
vive le troll !
Posté le 25-07-2004 à 15:57:01  profilanswer
 

peut-être utiliser std::list ?


---------------
-( BlackGoddess )-
n°805718
_momone_
Posté le 25-07-2004 à 15:59:18  profilanswer
 

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

n°805723
Taz
bisounours-codeur
Posté le 25-07-2004 à 16:12:46  profilanswer
 

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

n°805728
_momone_
Posté le 25-07-2004 à 16:25:48  profilanswer
 

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

n°805734
Taz
bisounours-codeur
Posté le 25-07-2004 à 16:38:35  profilanswer
 

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

n°805735
Taz
bisounours-codeur
Posté le 25-07-2004 à 16:41:17  profilanswer
 

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

mood
Publicité
Posté le 25-07-2004 à 16:41:17  profilanswer
 

n°805743
_momone_
Posté le 25-07-2004 à 17:01:04  profilanswer
 

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
n°805744
Taz
bisounours-codeur
Posté le 25-07-2004 à 17:06:26  profilanswer
 

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

n°860076
paskiki
Posté le 29-09-2004 à 15:20:26  profilanswer
 

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

n°860079
paskiki
Posté le 29-09-2004 à 15:22:12  profilanswer
 

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

n°860240
Taz
bisounours-codeur
Posté le 29-09-2004 à 16:56:08  profilanswer
 

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


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

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

 

Sujets relatifs
replace seulement sur le premier élément[swing] - creation d'element
histoire de pointeurPeux t'on afficher le contenu d'un pointeur ?
[JavaScript]Probleme de "ciblage" d'un élément[resolu]Comment afficher le nombre d'element d'une BDD
Virer un element d'une page HTML[JS] 2 question: position d'un element et pb avec layerY ou Y
[VB 6] Liste d'un seul élément et affichage [RESOLU]pointeur de fonction membre d'une classe
Plus de sujets relatifs à : Pointeur sur un élément d'un std::vector


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