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 Suppression d'un element dans un vecteur


Sujet :

C++

  1. #1
    Membre du Club
    Inscrit en
    Mai 2013
    Messages
    128
    Détails du profil
    Informations forums :
    Inscription : Mai 2013
    Messages : 128
    Points : 56
    Points
    56
    Par défaut Probleme Suppression d'un element dans un vecteur
    Bonjour tout le monde

    je voudrais supprimer un élément depuis un vecteur

    Voilà la methode que j'ai fai :

    en c# je fai le même principe et ça marche ...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    void Equipe::SuppimerJoueurs(Joueur const &j)
    {
         for(size_t i=0;i<ListJoueurequipe.size();i++)
    {
        if ( ListJoueurequipe[i].Getnum()=j.Getnum())
        {
        ListJoueurequipe.erase(i);
        }
     
         }
     
       }
    Voilà les deux erreurs que je recois

    Erreur2error C2664: 'std::_Vector_iterator<_Myvec> std::vector<_Ty>::erase(std::_Vector_const_iterator<_Myvec>)' : impossible de convertir le paramètre 1 de 'size_t' en 'std::_Vector_const_iterator<_Myvec>'

    Erreur1error C2662: 'Joueur::Getnum' : impossible de convertir un pointeur 'this' de 'const Joueur' en 'Joueur &'

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 115
    Points : 32 967
    Points
    32 967
    Billets dans le blog
    4
    Par défaut
    Bonjour,

    peut-être faudrait-il commencer par lire la doc de vector::erase ?
    Où il apparait très clairement que erase annule l'itérateur supprimé et le rend inutilisable. Mais retourne l'itérateur suivant justement.
    Et que si tu fais un it++ sur un itérateur supprimé... tu as vu le résultat.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  3. #3
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 614
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 614
    Points : 30 626
    Points
    30 626
    Par défaut
    Salut,

    Fais aussi attention à ton test, car
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if ( ListJoueurequipe[i].Getnum()=j.Getnum())
    ne fait surement pas ce que tu crois (à condition que cela compile... en fonction du fait que GetNum est une fonction constante ou non et en fonction du type de retour (valeur ou référence ) de la fonction).

    Dans le meilleur des cas (comprends : si GetNum est déclarée comme étant une fonction constante renvoyant une référence constante), le compilateur se plaindra de l'impossiblité de modifier la valeur.

    Dans le pire des cas, (si GetNum est déclarée comme une fonction non constante et qu'elle renvoie une référence non constante), tu modifiera la valeur renvoyée par GetNum de tous les éléments de ListJoueurequipe, et ils seront tous supprimés

    Entre les deux (fonction (constante ou non) renvoyant une valeur), le test vaudra true si j.GetNum est différent de 0. Ce qui risque d'arriver dans la très grande majorité des cas, et qui provoquera donc l'effacement de la très grosse majorité des éléments (pour ne pas dire de tous, selon que tu acceptes ou non qu'un joueur ait le numéro 0).

    L'égalité se teste toujours avec l'opérateur == (deux fois le symbole '=' qui se suit), sinon c'est une affectation!!!
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  4. #4
    Membre émérite
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 764
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 764
    Points : 2 705
    Points
    2 705
    Par défaut
    Pose-toi aussi la question de savoir si le vecteur est la structure de données la plus adaptée.

    Par ailleurs, ta fonction est nommée SuppimerJoueurs, alors que je pense qu'un seul joueur sera supprimé (à moins que tu autorises 2 joueurs à voir le même numéro). Auquel cas, ta fonction est mal nommée (pluriel indésirable) et sous-optimisée (tu parcours les éléments de ton vecteur même après avoir trouvé le joueur en question).

    Je te suggérerais plutôt d'utiliser un std::find(), suivi d'un erase().

Discussions similaires

  1. probleme avec nombre d'elements dans un dictionnaire
    Par lps02 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 31/05/2012, 21h21
  2. Réponses: 8
    Dernier message: 11/06/2009, 20h46
  3. Suppression d'un élément dans un vecteur
    Par C.R.E.A.M dans le forum SL & STL
    Réponses: 6
    Dernier message: 02/02/2008, 23h11
  4. suppression de la répétition dans un vecteur
    Par Minouchka dans le forum C
    Réponses: 2
    Dernier message: 23/01/2008, 19h36
  5. Réponses: 7
    Dernier message: 17/04/2007, 13h51

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