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

SL & STL C++ Discussion :

Iterateur d'un vector


Sujet :

SL & STL C++

  1. #21
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Par défaut
    Non, l'itérateur sera invalidé si tu ne fait pas un e.erase(i++); et donc tu dois tout changer. C'est pour ce genre de choses qu'il y a remove.

  2. #22
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Citation Envoyé par Miles
    Non, l'itérateur sera invalidé si tu ne fait pas un e.erase(i++); et donc tu dois tout changer. C'est pour ce genre de choses qu'il y a remove.
    Suffit de récupérer l'itérateur renvoyé par erase, comme indiqué dans la FAQ.

  3. #23
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Par défaut
    Ah oui, c'est vrai, le erase de vector renvoie l'itérateur valide

  4. #24
    BNS
    BNS est déconnecté
    Membre confirmé
    Inscrit en
    Juin 2005
    Messages
    129
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 129
    Par défaut
    A la lumière de vos conseils j'ai réécris le code, qui, après quelques tests, a l'air de fonctionner:
    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
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    int CPeople::CheckAssociation(vector<CBox::MyPoints> &MonVecteur)
    {
    	int NumberOfPoint = MonVecteur.size();
    
    	if (MyPeople.empty())
    	{
    		NotAssociate(MonVecteur,NumberOfPoint);
    	}
    	else
    	{
    		for (vector<people>::iterator it=MyPeople.begin(); it!=MyPeople.end();)
    		{
                            // Cette fonction ne fait qu'éventuellement mettre à jour mon vecteur, elle ne va pas ajouter ou supprimer d'éléments
    			int detect = Search(*it,MonVecteur,NumberOfPoint);
    
                            // Cette boucle if est le seul endroit ou je suis amené á supprimer des éléments de mon vecteur.
    			if (detect==0)
    			{
    				people p;
    				p = *it;
    				int x = p.X_PredictPoint ;
    				int y = p.Y_PredictPoint ;
    				if ( (x<=MARGE_X_LEFT) || (x>=MARGE_X_RIGHT) || (y<=MARGE_Y_BOTTOM) || (y>=MARGE_Y_TOP) )
    				{
    					it = MyPeople.erase(it);
    				}
    				else
    				{
    					UpdatePeople(p,x,y);
    					++it;
    				}
    			}
    			else ++it;
    		}
                    // Cette fonction n'est plus dans la boucle, donc pas de problème pour l'itérateur
    		NotAssociate(MonVecteur,NumberOfPoint);
    	}
    
    	return 0;
    }
    Le code vous parait-il correct? Si jamais vous vouliez me faire des remarques pour améliorer celui-ci, pour le rendre plus rapide, plus clair ou autre chose, elles sont les bienvenues. Je programme sans etre un "pur" informaticien, et j'ai très envie de corriger tous (ou un maximum pour être pls réaliste ) les défauts que cela implique, d'apprendre comment faire du code le plus "propre" possible.

  5. #25
    Expert confirmé
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 297
    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 297
    Par défaut
    const transporte des informations : la donnée n'évolura jamais.
    Citation Envoyé par traduction à la volée de C++ Coding Standard d'H.Sutter et A.Alexandrescu
    const est votre ami: Les valeurs non modifiables sont plus simples à comprendre, suivre (/to track), et facilitent le raisonnement[....]
    Les constantes simplifient le code parce que vous n'avez qu'à regarder à l'endroit de leur définition pour connaitre leur valeur partout ailleurs
    J'adhère assez.

    Citation Envoyé par BNS
    Concrètement et simplement ca voudrait dire ca (?):
    Considérons un vecteur e composé de 5 éléments e={0, 0, 1, 0, 0}. Je veux supprimer proprement le seul élément non nul. Je peux donc faire ca:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    int i = 0 ;
    while ( i != e.end() )
    {
       if ( e.at(i) != 0 ) e.erase(i);
       else ++i;
    }
    Le resultat final sera alors e = {0,0,0,0} sans bug entre temps?
    Dans ce cas particulier, l'idiome erase-remove est ton ami.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    e.erase(std::remove(e.begin(), e.end(), 0), e.end());
    // j'avoue, ce bout de code supprime les éléments nuls
    // pour bien faire, il faut utiliser remove_if, not et equals
    Si tu veux faire des trucs plus compliqués, tu as remove_if dans un premier temps, puis le déroulage de la boucle à la main.

    PS: ton code me parait bizarre vu que tu fais un update sur des copies des éléments de ton vecteur.
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

Discussions similaires

  1. Vector et Iterateurs
    Par miller31 dans le forum Général Java
    Réponses: 2
    Dernier message: 09/04/2015, 09h24
  2. STL/vector : conversion indice : "int" en iterateur
    Par sebkramm dans le forum SL & STL
    Réponses: 7
    Dernier message: 29/09/2007, 15h06
  3. Iterateur sur pointeur de vector
    Par Pragmateek dans le forum SL & STL
    Réponses: 9
    Dernier message: 13/05/2006, 14h50
  4. "vector" provoque "syntax error", malgré
    Par seenkay dans le forum Autres éditeurs
    Réponses: 5
    Dernier message: 24/08/2003, 04h21
  5. Réponses: 2
    Dernier message: 11/07/2003, 19h24

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