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 :

unordered_set big problem


Sujet :

C++

Vue hybride

Message pr�c�dent Message pr�c�dent   Message suivant Message suivant
  1. #1
    Membre confirm�
    Homme Profil pro
    �tudiant
    Inscrit en
    Mars 2014
    Messages
    126
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activit� : �tudiant

    Informations forums :
    Inscription : Mars 2014
    Messages : 126
    Par d�faut unordered_set big problem
    Bonjour, je remercie par avance tous ceux qui s'int�resseront � mon probl�me. J'ai cherch� une solution au probl�me suivant, j'en ai trouv�, aucune n'a march�. Le voici : j'impl�mente un algorithme de clustering et j'aurai besoin de stocker mes ar�tes dans un ensemble qui n'accepte pas les doublons. Pour ce faire j'ai d�cid� d'utiliser un "unordered_set" . D'apr�s le prototype de la fonction j'ai vu que je devais fournir une fonction de hachage pour mon objet Edge et aussi d'une fonction qui permet de tester l'�galit�.

    Voici l'une des nombres choses que j'ai test� :


    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
    template<typename T>
    struct MyEdgeHash : public std::unary_function<std::edge<T>, size_t> {
       size_t operator()(const std::edge<T>& e) const
       {
          return hash(e.cost);
       }
    };
     
    template<typename T>
    struct MyedgeEqual : public std::unary_function<std::edge<T>, bool> {
     
       bool operator()(const std::edge<T>& left, const std::edge<T>& right) const
       {
          return (left.vertex1 == right.vertex1 and left.vertex2 == right.vertex2) or (left.vertex1 == right.vertex2 and left.vertex2 == right.vertex1);
       }
    }; 
    typedef unordered_set<edge<Edge>, MyEdgeHash<Edge>, MyedgeEqual<Edge>> Graph;
    Je suis d�butant en C++ j'ai essay� d'adapter � mon probl�me une solution que j'ai trouv� sur le net mais j'obtiens des erreurs du style "extra qualification 'Edge'::on member operator ==

    Pourtant j'ai trouv� partout qu'il fallait red�finir cet op�rateur alors je perds un espoir. Merci de votre aide.

  2. #2
    Expert �minent

    Femme Profil pro
    Ing�nieur d�veloppement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    D�tails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (�le de France)

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

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 202
    Par d�faut
    Tu as opt� pour un set, bon choix.
    Reste � savoir si tu veux une fonction de hashage ou un operateur de comparaison.
    set et unordered-set sont tes deux choix.

    Si tes ajouts ne sont pas fr�quents, un set est aussi un bon choix.

    Si ton probl�me est incapable d'avoir des doublons (garantie sur les donn�es), un vector peut tout aussi bien faire l'affaire.

  3. #3
    Membre confirm�
    Homme Profil pro
    �tudiant
    Inscrit en
    Mars 2014
    Messages
    126
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activit� : �tudiant

    Informations forums :
    Inscription : Mars 2014
    Messages : 126
    Par d�faut
    Bonjour l'�ternel et merci de ta r�ponse, en fait je vais faire des centaines de milliers d'ajouts dans mon unordered_set mais toutes d'un coup ensuite je n'y touche plus. En revanche tu m'as demand� si je voulais une fonction de comparaison ou de hachage mais d'apr�s le prototype de la classe unordered_set j'ai l'impression d'avoir besoin des deux nan ? Ce qui complexifie la chose je trouve c'est que ces templates (que je connais pas tellement en fait) ont l'air de ressembler � la programmation g�n�rique en JAVA. Or moi je n'ai pas besoin de pouvoir cr�er un set de tous les types possibles mais juste un set de Edge. Edge est d�finie comme ceci :

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    typedef struc {
           string vertex1;
           string vertex2;
           int cost;
    };
    Algorithmiquement je sais exactement ce que je veux, je voudrais cr�er un set dans lequel je ne puisse pas mettre 2 ar�tes qui soient les m�mes (sinon mon clustering est fauss�).

    2 ar�tes sont les m�mes si elles ont les m�mes sommets de d�part et d'arriv�e (quitte � faire un swap sur le sommet de d�part et d'arriv�e de l'une des deux ar�tes).

    Au point o� j'en suis je sais (ou je crois savoir ) qu'il me faut une fonction de hashage pour mon type Edge (pourquoi pas hash en fonction du cost ? ) et une fonction de comparaison que je sais �crire.

    Ce que je voudrais savoir c'est si quelqu'un pouvait m'aider � l'�crire avec la syntaxe c++11 car aucun de mes essais n'aboutissent. Merci encore

  4. #4
    R�dacteur/Mod�rateur
    Avatar de JolyLoic
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Ao�t 2004
    Messages
    5 463
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 51
    Localisation : France, Yvelines (�le de France)

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

    Informations forums :
    Inscription : Ao�t 2004
    Messages : 5 463
    Par d�faut
    Je vois pas mal de soucis qui indiquent du code �crit sans vraiment le comprendre...
    C'est quoi std::edge ? Il n'y a pas de classe edge dans la biblioth�que standard.
    Quand tu utilises MyEdgeHash<Edge>, tu instancie MyEdgeHash avec T valant Edge, donc l'op�rateur () de cette classe prend en param�tre un std::edge<Edge>, alors qu'il devrait prendre un Edge pour marcher.
    Pourquoi faire de MyEdgeHash un template ? Comme tu le dis, tu n'as pas besoin de g�n�ricit� ici, tu connais exactement ton type.

    Donc: (code non test�)
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
     
    struct MyEdgeHash : public std::unary_function<Edge, size_t> {
       size_t operator()(const Edge& e) const
       {
          return std::hash(e.cost);
       }
    };
    Sachant que plut�t que de passer un hasher sp�cifique, je pr�f�re g�n�ralement sp�cialiser std::hash pour mon type (voir le dernier exemple sur http://en.cppreference.com/w/cpp/utility/hash). Comme �a, il sera pris pas d�faut partout o� il sera requis sans que tu aies besoin de sp�cifier les param�tres templates qui vont bien.
    Ma session aux Microsoft TechDays 2013 : D�velopper en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage � la d�couverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'h�sitez pas � me contacter.

Discussions similaires

  1. firbird BIG problem
    Par chekkal dans le forum Firebird
    R�ponses: 1
    Dernier message: 30/10/2011, 06h48
  2. R�ponses: 3
    Dernier message: 06/05/2008, 23h42
  3. j'ai un big probleme avec js et css
    Par PsychoTrip dans le forum G�n�ral JavaScript
    R�ponses: 1
    Dernier message: 07/06/2007, 15h17
  4. big probleme JTextArea
    Par topnet dans le forum AWT/Swing
    R�ponses: 1
    Dernier message: 07/04/2006, 09h24
  5. [Upload] Php : script d'Upload vers mon site : Big Probleme
    Par CyberTwister dans le forum Langage
    R�ponses: 8
    Dernier message: 27/03/2006, 08h06

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