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 :

Affecter la valeur 0 à un map iterator?


Sujet :

C++

  1. #1
    Membre éclairé Avatar de Seabirds
    Homme Profil pro
    Post-doctoral fellow
    Inscrit en
    Avril 2015
    Messages
    294
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Post-doctoral fellow
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Avril 2015
    Messages : 294
    Par défaut Affecter la valeur 0 à un map iterator?
    Salut!

    J'aide un collègue à débugger un code hérité, et en passant j'essaie de restructurer un peu les zones suspicieuses.
    Notamment, je trouve les lignes suivantes:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    unordered_map<PAIR, int, hash_PAIR> common2;
    unordered_map<TRIPLE, int, hash_TRIPLE> common3;
    unordered_map<PAIR, int, hash_PAIR>::iterator common2_it;
    unordered_map<TRIPLE, int, hash_TRIPLE>::iterator common3_it;
     
    #define common3_get(x) (((common3_it = common3.find(x)) != common3.end()) ? (common3_it->second) : 0)
    #define common2_get(x) (((common2_it = common2.find(x)) != common2.end()) ? (common2_it->second) : 0)
    J'essaie de me débarasser des variables globales et de la macro, mais je ne suis pas certain de comprendre ce qui est sensé se passer: pourquoi attribuer la valeur 0 à ... un map iterator ?
    Quelqu'un à une idée de ce que ce code pourrait vouloir dire ? Je suis aussi étonné que ça compile (c'est une macro, elle est pre-processed mais pas compiled?).

    Merci !

  2. #2
    Expert confirmé
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 766
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 766
    Par défaut
    Citation Envoyé par Seabirds Voir le message
    pourquoi attribuer la valeur 0 à ... un map iterator ?
    En attendant les experts C++ es-tu sérieux ?

    Tes macros sont juste 1 test ternaire que l'on peut remplacer par
    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
    int common2_get(PAIR x, const unordered_map<PAIR, int, hash_PAIR>& map) {
        unordered_map<PAIR, int, hash_PAIR>::iterator map_it = map.find(x);
     
        if (map_it != map.end() { // if found key x
            return (map_it ->second); // return value of key x
        } else {
            return 0;
        }
    }
     
     
    int common3_get(TRIPLE x, const unordered_map<TRIPLE, int, hash_TRIPLE>& map) {
        unordered_map<PAIR, int, hash_TRIPLE>::iterator map_it = map.find(x);
     
        if (map_it != map.end() { // if found key x
            return (map_it ->second); // return value of key x
        } else {
            return 0;
        }
    }

  3. #3
    Membre éclairé Avatar de Seabirds
    Homme Profil pro
    Post-doctoral fellow
    Inscrit en
    Avril 2015
    Messages
    294
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Post-doctoral fellow
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Avril 2015
    Messages : 294
    Par défaut
    Argh mon dieu j'avais pas les yeux en face des trous (en plus d'etre particulièrement désorienté par la syntaxe de macro). Sorry

    J'avais bien compris ce que le terrnaire faisait (retourner la valeur trouvée dans la map, ou zero) mais je n'étais pas clair sur ce que que l'iterateur venait faire là dedans (ni pourquoi dans le code initial cet iterateur est defini comme une variable globale). J'avais l'impression que l'iterator recevait une valeur, mais en fait il est juste utilisé en lecture.

    Du coup, supposé que la class key implement un hash, on peut remplacer ces deux fonctions par quelque chose comme (pas certain que ça compile mais pour l'idée):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    template<class Key, class T>
    T common2_get(key x, const unordered_map<key, T, key::hash>& map)
    {
       auto it = map.find(x);
       return (it == map.end()) ? it->second : 0;
     }

  4. #4
    Expert confirmé
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 766
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 766
    Par défaut
    Citation Envoyé par Seabirds Voir le message
    Du coup, supposé que la class key implement un hash
    j'ai vu passer std::hash (<- lien avec la documentation cplusplus.com en anglais)

  5. #5
    Membre éclairé Avatar de Seabirds
    Homme Profil pro
    Post-doctoral fellow
    Inscrit en
    Avril 2015
    Messages
    294
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Post-doctoral fellow
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Avril 2015
    Messages : 294
    Par défaut
    Mhhh ok? Je suis pas certain d'avoir besoin de std::hash si la class key definit ça (et quelques operateurs), n'est-ce-pas?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    struct key
    {
        ///
        /// @brief Hashable and usable in hashmaps
        ///
        struct hash
        {
          size_t operator()(const key_triple &x) const
          {
            return (x.a << 16) ^ (x.b << 8) ^ (x.c << 0);
          }
        };
    }

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

Discussions similaires

  1. Affecter la valeur NULL à une cellule d'une table
    Par jacma dans le forum Général JavaScript
    Réponses: 9
    Dernier message: 06/05/2005, 14h43
  2. Réponses: 4
    Dernier message: 07/04/2005, 13h37
  3. Affecter une valeur à un radiobutton svp
    Par bigfoot dans le forum Bases de données
    Réponses: 5
    Dernier message: 30/12/2004, 11h17
  4. [scriplet] affecter une valeur par un bean:write
    Par viena dans le forum Servlets/JSP
    Réponses: 5
    Dernier message: 25/11/2004, 16h29
  5. [struts][jsp]Valeur dans un logic:iterate
    Par GreenJay dans le forum Servlets/JSP
    Réponses: 7
    Dernier message: 21/06/2004, 11h45

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