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 772
    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 772
    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 772
    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 772
    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