Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Problème de pointeur avec vector après erase()

11 réponses
Avatar
none
Bonjour,

Voici un exemple très simplifié de mon problème:

std::vector<int> foo;

foo.push_back(1);
foo.push_back(2);
foo.push_back(3);

int *pun = &foo.at(0);
int *pdeux = &foo.at(1);
int *ptrois = &foo.at(2);

foo.erase(foo.begin() + 1);

Après erase(), *pdeux == 3.

Existe-t-il une solution pour qu'au momment ou erase() est invoqué,
pdeux pointe toujours vers 2 sachant que je ne peux pas réaffecter pun,
pdeux et ptrois explicitement ?

merci pour votre aide.

Xavier

1 réponse

1 2
Avatar
xavier
James Kanze wrote:
On Mar 27, 10:44 pm, none <""none"@(none)"> wrote:

Voici un exemple très simplifié de mon problème:

std::vector<int> foo;

foo.push_back(1);
foo.push_back(2);
foo.push_back(3);

int *pun = &foo.at(0);
int *pdeux = &foo.at(1);
int *ptrois = &foo.at(2);

foo.erase(foo.begin() + 1);


Dans toutes les collections, après erase(), des pointeurs, des
références et des itérateurs à l'élément effacé sont invalids.
C'est difficile à concevoir comment ça pourrait être autrement ;
comment maintenir un pointeur valid à quelque chose qui n'existe
plus ?

J'ai comme une petite doute que tu dois revoir ta conception,
parce que si ta conception exige des pointeurs à des objets
inexistant, il y a un problème de base.



je me suis mal exprimé, en fait ce n'est pas un résultat défini dans
pdeux qui m'intéresse, mais plutôt que ptrois continue de pointer vers
l'espace mémoire ou est stocké 3.
En fait, il me faudrait un containeur comme vector mais qui ne déplace
pas tous les objets en mémoire quand on en manipule un.


1 2