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 :

find sur le vector


Sujet :

SL & STL C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé Avatar de LeXo
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    1 147
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Janvier 2004
    Messages : 1 147
    Par défaut find sur le vector
    Bonjour

    voila j'ai un soucis sur le find
    si je fais


    j'ai une méthode de classe

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    void deleteClient(Client p){
     
    it=find(it,vClient.begin(),vClient.end(),p);
    vClient.erase(it);
    }
    mais quand je compile il met fais plein d'erreur

    alors la question que je me posais ??

    est ce que le find ne prend que des type primitifs ?

  2. #2
    Membre émérite
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    780
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mai 2006
    Messages : 780
    Par défaut
    tu as un iterateur de trop dans ton find.

    ton code devrait ressembler à :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    TonVector::iterator ite = find( vClient.begin(), vClient.end(), p );
    Et pour que ça marche, il faut que tu definisses un operator==( const Client&, const Client &).

  3. #3
    r0d
    r0d est déconnecté
    Membre expérimenté

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 290
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 290
    Billets dans le blog
    2
    Par défaut
    nikko34 a parfaitement raison. Je rajouterais juste 2 petites remarques en passant:
    1. pour ce ce code fonctionne, il faut que ta classe client possède un opérateur == (ou que ce soit un POD) <edit>grilled</edit>
    2. je te conseilles de vérifier que ton find ait bien trouvé l'objet recherché avant d'utiliser l'iterateur ( dans l'exemple de nikko34, ça donnerais: if (ite!=vClient.end()) )

  4. #4
    Membre émérite
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    780
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mai 2006
    Messages : 780
    Par défaut
    Citation Envoyé par r0d Voir le message
    2. je te conseilles de vérifier que ton find ait bien trouvé l'objet recherché avant d'utiliser l'iterateur ( dans l'exemple de nikko34, ça donnerais: if (ite!=vClient.end()) )
    oui sinon ton erase il va supprimer le dernier élément, ou en tout cas faire n'importe quoi si le find n'a pas trouvé le bon.

  5. #5
    r0d
    r0d est déconnecté
    Membre expérimenté

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 290
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 290
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par nikko34 Voir le message
    oui sinon ton erase il va supprimer le dernier élément, ou en tout cas faire n'importe quoi si le find n'a pas trouvé le bon.
    Non, ça ne supprimera pas le dernier élément, ni faire n'importe quoi, ça va crasher tout simplement ( déréférencement de vClient.end() => crash )

  6. #6
    Membre émérite
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    780
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mai 2006
    Messages : 780
    Par défaut
    Citation Envoyé par r0d Voir le message
    Non, ça ne supprimera pas le dernier élément, ni faire n'importe quoi, ça va crasher tout simplement ( déréférencement de vClient.end() => crash )
    dans le petit test que j'ai fait il n'a pas crashé, il a juste effacé le dernier. Comme si j'avais fait v.erase( v.end() - 1 ); Sauf que là c'est a.erase( v.end() ); ( qui ne crashe pas... forcément ).

  7. #7
    Membre Expert

    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 294
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 294
    Par défaut
    Salut,

    Sinon si le but est de retirer du vecteur les éléments égaux à p tu peux aussi faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    vClient.erase( std::remove( vClient.begin(), vClient.end(), p ), vClient.end() );
    MAT.

  8. #8
    Membre émérite
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    780
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mai 2006
    Messages : 780
    Par défaut
    Citation Envoyé par Mat007 Voir le message
    Salut,

    Sinon si le but est de retirer du vecteur les éléments égaux à p tu peux aussi faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    vClient.erase( std::remove( vClient.begin(), vClient.end(), p ), vClient.end() );
    MAT.
    ouaip, en plus si "p" ne correspond à aucun élement du tableau, il ne fait rien.

  9. #9
    r0d
    r0d est déconnecté
    Membre expérimenté

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 290
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 290
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par nikko34 Voir le message
    Et pour que ça marche, il faut que tu definisses un operator==( const Client&, const Client &).
    Citation Envoyé par r0d Voir le message
    1. pour ce ce code fonctionne, il faut que ta classe client possède un opérateur == (ou que ce soit un POD)

  10. #10
    Membre éprouvé Avatar de LeXo
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    1 147
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Janvier 2004
    Messages : 1 147
    Par défaut
    au risque de paraitre beta, il me semble que j'ai compris

    on surchage, l'operateur d'egalite pour comparer 2 clients
    j'ai ajouter

    dans ma classe Client

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    bool operator==(const Client& c1, const Client& c2){
    	return c1.getSock()==c2.getSock();
    }
    mais
    must take exactly one argument

  11. #11
    Membre Expert

    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 294
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 294
    Par défaut
    Un opérateur de comparaison membre a cette forme-là :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    class Client
    {
    ...
    public:
        bool operator==(const Client& rhs) const {
    	return getSock()==rhs.getSock();
        }
    ...
    };
    Sinon pour une fonction libre (donc en dehors de la déclaration de la classe) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    inline bool operator==(const Client& c1, const Client& c2){
        return c1.getSock()==c2.getSock();
    }
    (ou pas inline si tu mets juste la déclaration et ajoutes la définition dans un .cpp)

    MAT.

Discussions similaires

  1. find sur un vector qui contient une structure
    Par kunda dans le forum SL & STL
    Réponses: 14
    Dernier message: 28/04/2009, 21h35
  2. Réponses: 7
    Dernier message: 18/04/2006, 17h44
  3. Réponses: 15
    Dernier message: 20/09/2005, 09h54
  4. std::sort() sur std::vector()
    Par tut dans le forum SL & STL
    Réponses: 20
    Dernier message: 05/01/2005, 19h15
  5. [debutant STL] question sur les vectors
    Par killerjeff dans le forum SL & STL
    Réponses: 13
    Dernier message: 19/08/2004, 17h32

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