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 :

la difference entre deux std::unordered_set


Sujet :

C++

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    338
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2011
    Messages : 338
    Points : 0
    Points
    0
    Par défaut la difference entre deux std::unordered_set
    Bonsoir,
    Je voulais savoir comment faire pour avoir la différence entre deux std::unordered_set ?

    c'est à dire si on a :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    std::unordered_set<edge_iter> v1,v2;
    a difference entre v1 et v2 seront les edge_iter qui se trouve dans v1 et qui ne se trouve pas dans v2.

  2. #2
    Membre émérite
    Avatar de Daïmanu
    Homme Profil pro
    Développeur touche à tout
    Inscrit en
    Janvier 2011
    Messages
    696
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur touche à tout

    Informations forums :
    Inscription : Janvier 2011
    Messages : 696
    Points : 2 438
    Points
    2 438
    Par défaut
    Bonsoir.

    La bibliothèque standard C++ propose exactement la fonction qu'il te faut : std::set_difference.

    Cette page t'explique le fonctionnement et montre un exemple qui devrait faire ton bonheur

    Cordialement.
    Je fais appel aux esprits de Ritchie, Kernighan, Stroustrup et Alexandrescu
    Donnez moi la force, donnez moi le courage de coder proprement !

    « Ça marche pas » n'est PAS une réponse convenable, merci de détailler le souci en fournissant l’environnement, le code source, les commandes et les messages d'erreur.

    Ce club possède également un clavardage, on y trouve quelques perles entre deux sessions d'entraides.

  3. #3
    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
    C'est extraordinaire, c'est au moins le 3° topic que tu postes avec exactement le même "problème". Si on le sait pas que tu travailles sur des arbres et veux faire des "différences de collection".

    http://www.developpez.net/forums/d15...retes-graphes/
    http://www.developpez.net/forums/d15...re-std-vector/
    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.

  4. #4
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    338
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2011
    Messages : 338
    Points : 0
    Points
    0
    Par défaut
    voila ce que j'ai fais:
    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
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    std::unordered_set<std::array<int, 3>>  edgesdiff(Graph const& g1,Graph const& g2){
     
        std::unordered_set<edge_iter> v1,v2,diff;
        std::unordered_set<std::array<int, 3>> res;
     
        edge_iter ei1, ei1_end;
        edge_iter ei2, ei2_end;
        for (tie(ei1, ei1_end) = edges(g1); ei1 != ei1_end; ++ei1){v1.insert(ei1);}
        for (tie(ei2, ei2_end) = edges(g1); ei2 != ei2_end; ++ei2){v2.insert(ei2);}
        std::set_difference(v1.begin(), v1.end(), v2.begin(), v2.end(), std::inserter(diff, diff.begin()));
     
     
     
        for(auto x:diff){
     
     
                std::array<int, 3> t;
                vertex_t from = source(*x, g1);
                t[0]=g1[from].id;
     
                vertex_t to = target(*x, g1);
                t[1]=g1[to].id;
     
                edge_t edg = edge(from, to, g1);
                t[2]=g1[edg.first].label;
     
                res.insert(t);
     
        }
     
    return res;
    }
    Mais ça me donne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    hashtable_policy.h|85|error: no match for call to ‘(const std::hash<std::array<int, 3u> >) (const std::array<int, 3u>&)

  5. #5
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 189
    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 189
    Points : 17 141
    Points
    17 141
    Par défaut
    Et qu'en déduis-tu?
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

  6. #6
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    338
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2011
    Messages : 338
    Points : 0
    Points
    0
    Par défaut
    Citation Envoyé par leternel Voir le message
    Et qu'en déduis-tu?
    Je pense qu'il faut déclarer une fonction de hachage


    J'ai essayé de faire une alternative:
    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
    20
    21
    22
    23
    24
    25
    std::unordered_set<std::array<int, 3>>  edgesdiff(Graph const& g1,Graph const& g2){
     
        std::unordered_set<edge_iter> v1,v2,diff;
        std::array<int, 3> t;
        std::unordered_set<std::array<int, 3>> res;
     
     
        for(auto x:edges(g1)){
     
                vertex_t from = source(*x, g1);
                t[0]=g1[from].id;
     
                vertex_t to = target(*x, g1);
                t[1]=g1[to].id;
     
                edge_t edg = edge(from, to, g1);
                t[2]=g1[edg.first].label;
     
            if(!edgeexist(g2,t[0],t[1],t[2])){res.insert(t);}
     
     
        }
     
    return res;
    }
    sachant que:
    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
    20
    bool edgeexist(Graph const& g, int const& fromid, int const& toid, unsigned const& elabel) {
        int bn = 0;
     
            if (num_edges(g) != 0) {
                edge_pair ep;
                for (ep = edges(g); ep.first != ep.second; ++ep.first) // ep edge number
                {
                    vertex_t from = source(*ep.first, g);
                    vertex_t to = target(*ep.first, g);
                    edge_t edg = edge(from, to, g);
     
                    if ((g[from].id == fromid) && (g[to].id == toid) && (g[edg.first].label == elabel)) {
                        return true;
                    }
     
            }
        }
     
        return false;
    }
    mais ça me donne toujours:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    hashtable_policy.h|85|error: no match for call to ‘(const std::hash<std::array<int, 3u> >) (const std::array<int, 3u>&)’|

  7. #7
    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
    Si tu lisais un peu plus loin que la première ligne d'erreur, tu verrais sans doute le problème...
    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.

  8. #8
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    338
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2011
    Messages : 338
    Points : 0
    Points
    0
    Par défaut
    Citation Envoyé par Bousk Voir le message
    Si tu lisais un peu plus loin que la première ligne d'erreur, tu verrais sans doute le problème...
    Désolé, j'ai lu mais j'ai pas compris

Discussions similaires

  1. la difference entre deux std::vector
    Par mohsenuss91 dans le forum C++
    Réponses: 23
    Dernier message: 01/04/2015, 12h32
  2. Réponses: 7
    Dernier message: 03/02/2006, 13h50
  3. [EXCEL] difference entre deux fichiers
    Par Mokhtar BEN MESSAOUD dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 19/01/2006, 11h12
  4. [PIL] Difference entre deux images
    Par t_om84 dans le forum Calcul scientifique
    Réponses: 4
    Dernier message: 26/12/2005, 12h45
  5. difference entre deux requetes
    Par rdams dans le forum Requêtes
    Réponses: 3
    Dernier message: 21/12/2005, 09h38

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