IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

probleme de propagation de suppression dans un vecteur


Sujet :

C++

  1. #1
    Futur Membre du Club
    Inscrit en
    Juillet 2005
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 7
    Points : 5
    Points
    5
    Par défaut probleme de propagation de suppression dans un vecteur
    bonjour, j'ai un probleme lorsque je supprime un élement de mon vecteur. je vais essayer de me faire comprendre.

    Voila, j'ai un vecteur déclarer comme suit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    vector<Cellule *> _eCellule;
    et je faits evoluer toutes mes cellules grâce à cette fonction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    void Population::faireEvoluer()
    {
    	vector<Cellule *>::iterator it;
    	for(it=this->_eCellule.begin();it!=this->_eCellule.end();it++) (*it)->evoluer();
    }
    lorqu'une cellule meurt, elle appelle cette methode de la class population :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
    void Population::supprimerCellule(Cellule *pC)
    {
    	vector<Cellule *>::iterator it	=	this->_eCellule.begin();
     
    	//on recherche l'indice à supprime
    	bool find=false;
    	size_t indice=0;
    	while( (it!=this->_eCellule.end()) && (!find) )
    	{
    		if( (*it)==pC ) find = true;
    		else it++;
    	}
    	this->_eCellule.erase(it);
    }
    La suppression de la cellule se passe tres bien.
    mais, la fonction faireEvoluer veut quand même faire evoluer la cellule supprimée.....et donc ca plante.

    je pense que le probleme vient de la pile de ma fonction Population::faireEvoluer(). elle ne prend pas en compte la modification du vecteur par la fonction Population::supprimerCellule.
    ca ne marche que si je rappelle la fonction faireevoluer à la fin de la methode de suppression, mais on ne peut pas dire que cela soit super propre.

    J'espere que j'ai réussi à expliquer correctement mon probleme

  2. #2
    Membre éprouvé Avatar de Herode
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2005
    Messages
    825
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2005
    Messages : 825
    Points : 933
    Points
    933
    Par défaut
    La méthode std::vector.erase invalide les itérateurs. Tu ne peux pas continuer à itérer sur ton vector une fois que tu l'as utilisée. Il faut donc ré-initialiser un itérateur avec std::vector.begin() et recommencer les itérations.

  3. #3
    Futur Membre du Club
    Inscrit en
    Juillet 2005
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 7
    Points : 5
    Points
    5
    Par défaut
    Je viens de tester avec une simple boucle for qui recherche l'indice de l'element à supprimer, puis en supprimant cette indice. masi j'ai toujours le même probleme

  4. #4
    Membre éprouvé Avatar de Herode
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2005
    Messages
    825
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2005
    Messages : 825
    Points : 933
    Points
    933
    Par défaut
    Qu'appelles-tu "supprimer un indice" ?

  5. #5
    Membre confirmé
    Inscrit en
    Août 2004
    Messages
    556
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 556
    Points : 588
    Points
    588
    Par défaut
    J'aurai dis la même chose qu'Hérode.

    Vérifie bien que faireEvoluer est terminé avant de faire ton erase, tu peux le relancer après

  6. #6
    Expert éminent sénior
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 282
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 282
    Points : 11 036
    Points
    11 036
    Par défaut
    Si tu n'es pas en multithreads, tu as la possibilité de propager le prochain itérateur de ta boucle -- renvoyé par erase IIRC. Ce n'est pas forcément terrible terrible comme design. Renvoyer un boolean peut-être, qui renseignera si l'élément doit être retirer ou non?

    Sinon, il te faudra effectivement boucler sur des indices plutôt que des itérateurs.

Discussions similaires

  1. Réponses: 3
    Dernier message: 31/12/2013, 16h51
  2. suppression de la répétition dans un vecteur
    Par Minouchka dans le forum C
    Réponses: 2
    Dernier message: 23/01/2008, 20h36
  3. Probleme de suppression dans un vbalcolumntreeview
    Par Drik'C dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 22/08/2007, 12h29
  4. [STL] erreur compilation, suppression dans vecteur
    Par ZaaN dans le forum SL & STL
    Réponses: 1
    Dernier message: 03/07/2007, 17h32
  5. Réponses: 8
    Dernier message: 07/04/2006, 09h03

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo