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 :

Aide avec find_if


Sujet :

C++

  1. #1
    Membre confirmé
    Étudiant
    Inscrit en
    Février 2007
    Messages
    202
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2007
    Messages : 202
    Par défaut Aide avec find_if
    Après s'être inspiré d'un ancien post sur le forum developpez.com j'ai tenté d'utiliser find_if.

    Mais j'ai quelques soucis...

    Voici ce que je veux faire :

    Detecter un noeud dans une liste d'ojbet "Emprunteur" grâce à un ID stocké dans cette objet.

    Voici mon "code" :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    void HashT::remove(string itsPrenom, string itsNom) // Suppression d'une adhérent par nom et prenom
    {
    	list<Emprunteur>::iterator empIterator;
    	int id = HashFX(itsNom + itsPrenom);
    	empIterator = find_if(EmprunteurList.begin(), EmprunteurList.end(), MaClassEgal(id));
     
    }

    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
    #pragma once
    #include "Emprunteur.h"
     
    struct MaClassEgal
    {
        MaClassEgal(int n)
    	{
    		nb = n;
    	}
     
        bool operator ()(const Emprunteur& m) const
        {
    		return m.GetId() == nb;
        }
     
    private :
     
        int nb;
    };
    Merci pour votre aide

  2. #2
    Membre émérite

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

    Informations forums :
    Inscription : Septembre 2006
    Messages : 717
    Par défaut
    Ça a l'air correct, quel est le problème ?

  3. #3
    Membre confirmé
    Étudiant
    Inscrit en
    Février 2007
    Messages
    202
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2007
    Messages : 202
    Par défaut
    La voici : error C2275: 'EmprunteurList'*: utilisation non conforme de ce type comme expression

    Voici la définition dans le .h

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    typedef list<Emprunteur> EmprunteurList;
     
    ....
     
     
    private:
    	EmprunteurList **mTab;
    	unsigned int mTabSize;
    	unsigned int mnElement
    Je ne pense pas que ca vient de là étant donné que j'arrive à ajouter des éléments dans la liste... donc dans le tableau de pointeur sur liste Emprunteur (pfiou:p)

  4. #4
    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
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    EmprunteurList.begin(), EmprunteurList.end()
    EmprunteurList est un type, pas une variable.

    A part ça, un list<>** ... c'est vraiment nécessaire ?

  5. #5
    Membre confirmé
    Étudiant
    Inscrit en
    Février 2007
    Messages
    202
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2007
    Messages : 202
    Par défaut
    Si ca ne tenait qu'a moi : non !
    Je dois réaliser une table de hachage externe donc je vais devoir stocker les informations dans une liste chainée à l'indice du tableau modulo ma taille utile.

    Sinon tout fonctionne très bien maintenant !
    Merci pour votre aide !

    PS : je suis ouvert à toutes critiques de mon code, donc n'hésitez pas s'il existe une meilleur solution que <> ** ! Comprendre ses erreurs c'est apprendre

  6. #6
    Membre confirmé
    Étudiant
    Inscrit en
    Février 2007
    Messages
    202
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2007
    Messages : 202
    Par défaut
    Cela dit, j'ai encore une question au sujet du find_if !
    Comment savoir s'il a vraiment trouvé la valeur recherchée ?
    Car find_if return last s'il n'a rien trouvé mais si je n'ai qu'un element dans ma liste : first = last, donc je risque d'avoir des erreurs....

  7. #7
    Membre émérite

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

    Informations forums :
    Inscription : Septembre 2006
    Messages : 717
    Par défaut
    Non, find_if renvoi end() s'il n'a rien trouvé, c'est à dire un itérateur pointant après le dernier élément.

  8. #8
    Membre Expert
    Avatar de poukill
    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 155
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 155
    Par défaut
    Citation Envoyé par Laurent Gomila
    EmprunteurList est un type, pas une variable.
    Laurent a trouvé ton problème !

  9. #9
    Membre confirmé
    Étudiant
    Inscrit en
    Février 2007
    Messages
    202
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2007
    Messages : 202
    Par défaut
    to the first element in the range for which the application of pred to it does not return false (zero).
    If pred is false for all elements, the function returns last. www.cplusplus.com
    Tu en es sur pour le end ?

  10. #10
    Invité
    Invité(e)
    Par défaut
    je ne réponds pas vraiment a la question, mais pour ta table de hachage, as tu songé a utiliser le conteneur std::map<> ?

  11. #11
    Membre confirmé
    Étudiant
    Inscrit en
    Février 2007
    Messages
    202
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2007
    Messages : 202
    Par défaut
    Citation Envoyé par toxcct
    je ne réponds pas vraiment a la question, mais pour ta table de hachage, as tu songé a utiliser le conteneur std::map<> ?
    Non ! Car je ne connais pas très bien le conteneur std::map et il me semble que je ne peux faire du hachage extern avec. (Contrainte de mon projet...)

    Je me trompe ?

  12. #12
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par Krustig
    Non ! Car je ne connais pas très bien le conteneur std::map et il me semble que je ne peux faire du hachage extern avec. (Contrainte de mon projet...)
    qu'est ce qu'un hachage extern exactement ?

    pour ce qui est du map, c'est un tableau associatif (qui prend des pairs de valeurs, dont une clé (unique dans tout le tableau) et une valeur associée).

  13. #13
    Membre confirmé
    Étudiant
    Inscrit en
    Février 2007
    Messages
    202
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2007
    Messages : 202
    Par défaut
    Citation Envoyé par toxcct
    qu'est ce qu'un hachage extern exactement ?
    C'est que si ta une collision tu la traites de cette facon :

    SI f(clé) donne un indice "occupé" alors stocker la clé et son information dans une liste linéaire "accrochée" à la case d'indice i.

  14. #14
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par Krustig
    C'est que si ta une collision tu la traites de cette facon [...]
    euh, collision... moi perdu !
    collision de quoi ? si on essaye d'écrire dans une clé qui existe déja ?

    en tout cas, dans ce que tu dis, je ne vois aucune contre indication a l'utilisation du map, quitte meme à faire un truc du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    std::map<MonTypeCle, std::vector<MonTypeDesValeurs> >

  15. #15
    Membre confirmé
    Étudiant
    Inscrit en
    Février 2007
    Messages
    202
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2007
    Messages : 202
    Par défaut
    Citation Envoyé par toxcct
    euh, collision... moi perdu !
    collision de quoi ? si on essaye d'écrire dans une clé qui existe déja ?
    Exemple :
    tu as 100 valeurs à stocker dans un tableau de taille utile égale à 10.

    Toutes tes clees seront différentes si ta fonction de hachage est bonne. Mais comme tu as un tableau de taille utile 10 et non de 100, tu prends la valeur de ta clé et tu la fais modulo 10 pour pouvoir stocker ta valeur dans ton tableau. ( Collision possible )

    Tu aura ainsi l'indice du tableau où est stockée ta valeur !
    Il te suffit juste de parcourir la liste et tu retrouves ta valeur stockée dans ta table de hachage grâce à ta clée

  16. #16
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Une table de hachage gère typiquement les collisions de hachage avec des listes (généralement des listes chaînées).
    Cela est indépendant du fait d'exiger ou non l'unicité de la clé. Mais si les collisions sont gérés et que l'unicité de la clé est demandée, les listes peuvent (ou non) être triées pour faciliter la recherche d'une clé existante dedans.

    Sinon, une std::map est triée, elle utilise donc généralement un arbre plutôt qu'une table de hachage.


    Cette dualité (hash_map<> contre map<>) se retrouve aussi dans java (HashMap contre TreeMap) et .Net (Dictionary<> contre SortedDictionary<>).



    Dans l'idéal, un template de table de hachage devrait permettre de spécifier le type de liste à utiliser pour les collisions (ou bien, les interdire carrément) : typiquement std::list, std::vector, ou std::set.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  17. #17
    Membre confirmé
    Étudiant
    Inscrit en
    Février 2007
    Messages
    202
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2007
    Messages : 202
    Par défaut
    Merci pour cette réponse qui a le mérite d'être très claire

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

Discussions similaires

  1. Besoin d'aide avec Regexp::Assemble
    Par mobscene dans le forum Modules
    Réponses: 5
    Dernier message: 11/04/2007, 12h39
  2. [ASA] J'ai besoin d'aide avec sybase et vb6 svp !!
    Par tibo830 dans le forum SQL Anywhere
    Réponses: 7
    Dernier message: 12/05/2006, 10h09
  3. Besoin d'aide avec TinyXML
    Par Clad3 dans le forum Bibliothèques
    Réponses: 5
    Dernier message: 15/08/2005, 18h20
  4. Réponses: 2
    Dernier message: 29/08/2003, 17h52
  5. Besoin d'aide avec postgresql sous windows NT
    Par Chihuahua dans le forum PostgreSQL
    Réponses: 3
    Dernier message: 18/07/2003, 08h29

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