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 :

operator== pour comparer deux listes


Sujet :

C++

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 60
    Points : 34
    Points
    34
    Par défaut operator== pour comparer deux listes
    bonjour,

    j'ai vu qu'il existait des opérateurs pour les listes:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
      #include <list>
      list operator=(const list& c2);
      bool operator==(const list& c1, const list& c2);
      bool operator!=(const list& c1, const list& c2);
      bool operator<(const list& c1, const list& c2);
      bool operator>(const list& c1, const list& c2);
      bool operator<=(const list& c1, const list& c2);
      bool operator>=(const list& c1, const list& c2);
    Cependant j'arrive pas à m'en servir, ce sont des fonctions non-membres
    et quand je mets par exemple: operator==(list1,list2) mon compilateur ne reconnait pas, j'ai pourtant importé <list> dans mon fichier.
    Mon but est en fait de comparer deux listes pour voir si elles sont identiques.

    Merci pour votre aide

  2. #2
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Points : 4 625
    Points
    4 625
    Par défaut
    Chose étrange, std::list est un template, tes déclarations ne sont donc pas valides.

    Cependant j'arrive pas à m'en servir, ce sont des fonctions non-membres
    La plupart des opérateurs peuvent aussi bien se surcharger avec des fonctions libres qu'avec des fonctions membres.

    Ça s'utilise comme ceci.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    std::list<int> a;
    std::list<int> b;
    if(a == b)
       std::cout << "c'est égal, incroyable" << std::endl;
    et quand je mets par exemple: operator==(list1,list2) mon compilateur ne reconnait pas
    Ça devrait pourtant marcher, grâce à l'ADL. D'ailleurs ça marche très bien chez moi.
    Boost ftw

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 60
    Points : 34
    Points
    34
    Par défaut
    oui en fait je me suis mal exprimé je pense !
    quand je crée deux listes d'entiers que je compare ça marche
    mais quand je crée deux listes de Matière par exemple (classe que j'ai créé) ça marche pas)

    ex:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    std::list<Matiere> a;
    std::list<Matiere> b;
     
    if(a == b)
       std::cout << "c'est égal, incroyable" << std::endl;
    bah ceci ne marche pas j'ai une erreur sous visual:
    error C2678: '==' binaire : aucun opérateur trouvé qui accepte un opérande de partie gauche de type 'const Matiere' (ou il n'existe pas de conversion acceptable)

    sachant que j'ai déclaré la fonction operator== dans ma classe Matiere

  4. #4
    Membre éclairé

    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    717
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 717
    Points : 858
    Points
    858
    Par défaut
    Citation Envoyé par docky Voir le message
    sachant que j'ai déclaré la fonction operator== dans ma classe Matiere
    Montre nous comment tu l'a déclaré, il y a surement une erreur.

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 60
    Points : 34
    Points
    34
    Par défaut
    Matiere.h:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    bool operator==(const Matiere &matiere);
    Matiere.cpp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    bool Matiere::operator==(const Matiere &matiere){
    	if(annee==matiere.annee){
    		return true;
    	}else{
    		return false;
    	}
     
    }

  6. #6
    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,

    Par défaut, le langage ne sait comparer que les types primitifs.

    Dés qu'il s'agit de structures ou de classes, il est de ton ressort de surcharger les opérateurs de conversions que tu veux utiliser.

    en effet, les opérateurs de comparaison des conteneurs de la STL comparent non seulement la liste en elle-même (entre autres le nombre d'éléments que chacune contient) mais compare également chaque élément un à un (le premier de la première liste avec le premier de la seconde, le deuxième de la première liste avec le deuxième de la seconde, etc).

    Si tu n'a pas fournit au langage le moyen de comparer deux éléments de ta structure (ou classe), le compilateur ne sait pas comment il doit faire pour comparer deux liste d'élément de ta structure (ou classe)... et il te le fait savoir...

    Tu dois donc veiller à fournir l'opérateur de comparaison qui convient
    [EDIT]en outre, la STL utilise très souvent le predicat "less" (équivalent à l'operateur "<") pour ses comparaisons...

    Pour la STL, si A n'est pas plus petit que B et que B n'est pas plus petit que A, c'est donc que A est égal à B...

    C'est donc plutot l'opérateur < que tu dois définir, voir créer un prédicat
    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

  7. #7
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 60
    Points : 34
    Points
    34
    Par défaut
    Citation Envoyé par koala01 Voir le message
    Salut,

    Par défaut, le langage ne sait comparer que les types primitifs.

    Dés qu'il s'agit de structures ou de classes, il est de ton ressort de surcharger les opérateurs de conversions que tu veux utiliser.

    en effet, les opérateurs de comparaison des conteneurs de la STL comparent non seulement la liste en elle-même (entre autres le nombre d'éléments que chacune contient) mais compare également chaque élément un à un (le premier de la première liste avec le premier de la seconde, le deuxième de la première liste avec le deuxième de la seconde, etc).

    Si tu n'a pas fournit au langage le moyen de comparer deux éléments de ta structure (ou classe), le compilateur ne sait pas comment il doit faire pour comparer deux liste d'élément de ta structure (ou classe)... et il te le fait savoir...

    Tu dois donc veiller à fournir l'opérateur de comparaison qui convient
    je suis tout à fait d'accord mais ce n'est pas ce que je viens de faire juste au-dessus ?

  8. #8
    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
    Citation Envoyé par docky Voir le message
    je suis tout à fait d'accord mais ce n'est pas ce que je viens de faire juste au-dessus ?
    Au temps pour moi... tu as lu et répondu au message alors que je l'éditais...
    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

  9. #9
    jmv
    jmv est déconnecté
    Membre confirmé Avatar de jmv
    Profil pro
    Enseignant
    Inscrit en
    Mai 2004
    Messages
    395
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Mai 2004
    Messages : 395
    Points : 603
    Points
    603
    Par défaut
    salut,
    essaye de déclarer ta méthode opertor==() const
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    bool operator==(const Matiere &matiere) const;
     
    bool Matiere::operator==(const Matiere &matiere)  const
    {
    	if(annee==matiere.annee){
    		return true;
    	}else{
    		return false;
    	}
     
    }

  10. #10
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 60
    Points : 34
    Points
    34
    Par défaut
    merci ça marche !!!

    je ne sais plus à quoi cela sert const après une fonction, je pensais que c'était juste une indication pour le compilateur mais rien de plus !

  11. #11
    jmv
    jmv est déconnecté
    Membre confirmé Avatar de jmv
    Profil pro
    Enseignant
    Inscrit en
    Mai 2004
    Messages
    395
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Mai 2004
    Messages : 395
    Points : 603
    Points
    603
    Par défaut
    Citation Envoyé par docky Voir le message
    je ne sais plus à quoi cela sert const après une fonction, je pensais que c'était juste une indication pour le compilateur mais rien de plus !
    En fait l'operateur == de list reçoit 2 références sur des listes constantes (const list<> &), il ne peut donc que travailler avec des référence de type "const Matiere &", c'est pourquoi il ne peut utiliser les méthodes non const de la classe Matiere.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Comparer deux listes
    Par timtim2007 dans le forum Prolog
    Réponses: 7
    Dernier message: 07/06/2019, 09h02
  2. Requete pour comparer deux listes
    Par Jean-Christoph dans le forum Langage SQL
    Réponses: 3
    Dernier message: 17/04/2008, 13h29
  3. Réponses: 8
    Dernier message: 07/08/2006, 09h59
  4. [C# 2.0] Comparer deux listes
    Par Rodie dans le forum Windows Forms
    Réponses: 4
    Dernier message: 01/08/2006, 00h40

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