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

SL & STL C++ Discussion :

Ajout d'un élément dans un std::map


Sujet :

SL & STL C++

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 34
    Par défaut Ajout d'un élément dans un std::map
    Bonjour, j'ai besoin d'utiliser un map mais j'ai pas trop l'habitude de les manipuler.

    J'ai crée un map de dword et de CString ( std::map<DWORD, CString> m_IDArray)

    Je souhaite ajouter deux pair a mon map mais je sais pas trop comment m'y prendre malgré l'aide de la doc MFC. J'ai tenter avec un iterator:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    DWORD a, b;
     
    CreateThread(NULL, 0, &CServDlg::ThreadProc, &m_Server, 0, &a);
    CreateThread(NULL, 0, &CServDlg::ThreadProc, &m_Server, 0, &b);
     
    std::map<DWORD, CString>::iterator It = m_IDArray.begin();
     
    It->first = a;  (a est un dword qui représente l'id d'un thread)
    It->second = "Toto";
     
    It++;
    It->first = b;  (b est un dword qui représente l'id d'un thread)
    It->second = "Titi";

    Mais je rencontre une erreur :
    Error 2 error C3892: 'It' : you cannot assign to a variable that is const f:\test\serv\serv\servdlg.cpp 136

    Voila si vous savez quelle erreur j'ai commise ou encore mieux une façon de faire pour inserer mais élément bien plus propre je suis preneur.

    Merci d'avance,

  2. #2
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    Bonjour et bienvenu,
    Classiquement pour ajouter un élément à une map, on utilise la syntaxe suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    m_IDArray[a]="toto";
    m_IDArray[b]="titi";
    C'est à l'image de ce que tu aurais fait avec un CMap des MFCs.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 34
    Par défaut
    Merci sa marche niquel

    un grand merci a 3DArchi

  4. #4
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 633
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 633
    Par défaut
    Salut,

    Personnellement, je préfères la version verbeuse, à base de insert et de std::make_pair...

    En effet, lorsque l'on utilise la manière présentée par 3DArchi, nous courrons le risque de redéfinir une valeur pour une clé déjà existante

    Un simple exemple pour s'en convaincre tient en ces quelques lignes de code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    #include <iostream>
    #include <map>
    int main()
    {
        std::map<int, int> m;
        m[0] = 1;
        m[0] = 2;
        m[1] = 3;
        m[1] = 4;
        for(std::map<int,int>::const_iterator it= m.begin();it!=m.end();++it)
            std::cout<<(*it).first<<"->"<<(*it).second<<std::endl;
        return 0;
    }
    dont la sortie nous indique que ce qui est référencé par la clé "0" vaut... 2 et ce qui est référencé par la clé "1" vaut... 4, ce qui nous montre bel et bien qu'il y a redéfinition de la valeur, alors qu'un code utilisant la méthode insert et la fonction make_pair sous la forme de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    int main()
    {
        std::map<int, int> m;
        m.insert(std::make_pair(0,1));
        m.insert(std::make_pair(0,2));
        m.insert(std::make_pair(1,3));
        m.insert(std::make_pair(1,4));
        for(std::map<int,int>::const_iterator it= m.begin();it!=m.end();++it)
            std::cout<<(*it).first<<"->"<<(*it).second<<std::endl;
        return 0;
    }
    nous montrera que les différentes valeurs restent celles... de la première insertion.

    Maintenant, ce n'est sans doute que "pinaillage" de ma part
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  5. #5
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    C'est rigolo, car moi je préfère [] pour justement être sur que la dernière valeur rentrée est bien celle positionnée. Par contre, je me méfie de [] pour accéder à la valeur de la clé car l'entrée est créée dans la map:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    std::map<int, int> m;
    std::cout<<m[2];// Une entrée est créée dans la map pour la clé 2

  6. #6
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 633
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 633
    Par défaut
    Citation Envoyé par 3DArchi Voir le message
    C'est rigolo, car moi je préfère [] pour justement être sur que la dernière valeur rentrée est bien celle positionnée.
    Pour moi, cette optique présente l'inconvénient majeur de risquer de perdre l'adresse d'une ressource allouée dynamiquement, et donc d'observer une belle fuite mémoire...

    C'est pour cette raison que je préfères la version que je donne, généralement associée à un test du genre de if(m.find(key)==m.end())

    Mais bon, j'avoue avoir une légère tendance au "capillotractage" sur ce point
    Par contre, je me méfie de [] pour accéder à la valeur de la clé car l'entrée est créée dans la map:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    std::map<int, int> m;
    std::cout<<m[2];// Une entrée est créée dans la map pour la clé 2
    Là dessus, nous sommes bien d'accord
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  7. #7
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    Citation Envoyé par koala01 Voir le message
    Pour moi, cette optique présente l'inconvénient majeur de risquer de perdre l'adresse d'une ressource allouée dynamiquement, et donc d'observer une belle fuite mémoire...

    C'est pour cette raison que je préfères la version que je donne, généralement associée à un test du genre de if(m.find(key)==m.end())

    Mais bon, j'avoue avoir une légère tendance au "capillotractage" sur ce point

    Là dessus, nous sommes bien d'accord
    Pour aller jusqu'au bout, effectivement, dans les map, je précède généralement une insertion d'un test d'existence (if(m.find(key)==m.end())). Sans cela, ta méthode ou la mienne génère dans les deux cas des risques de pertes:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    int main()
    {
        std::map<int, int*> m;
        m.insert(std::make_pair(0,new int(1)));
        m.insert(std::make_pair(0,new int(2)));// perdu!
    ...
    }
    D'ailleurs, je précède le test d'existence dans beaucoup de manipulation sur les maps dès qu'il s'agit d'accéder à une clé précise !

  8. #8
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 633
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 633
    Par défaut
    Citation Envoyé par 3DArchi Voir le message
    Pour aller jusqu'au bout, effectivement, dans les map, je précède généralement une insertion d'un test d'existence (if(m.find(key)==m.end())). Sans cela, ta méthode ou la mienne génère dans les deux cas des risques de pertes:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    int main()
    {
        std::map<int, int*> m;
        m.insert(std::make_pair(0,new int(1)));
        m.insert(std::make_pair(0,new int(2)));// perdu!
    ...
    }
    Effectivement, la période entre les fête n'est vraiment pas à mon avantage ...

    Une preuve de plus de ce que je dis régulièrement
    Citation Envoyé par moi-même
    Aucune méthode n'est mauvaise, simplement, certaines sont plus efficaces que d'autres
    D'ailleurs, je précède le test d'existence dans beaucoup de manipulation sur les maps dès qu'il s'agit d'accéder à une clé précise !
    C'est également l'une de mes habitudes (qui fait partie des habitudes saines à adopter rapidement )

    Mais bon, comme je l'ai dit, tout ceci est pinaillage et capillotraction
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

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

Discussions similaires

  1. NullPointerException ajout d'un élément dans une Map
    Par pandora19 dans le forum Collection et Stream
    Réponses: 1
    Dernier message: 11/11/2012, 16h45
  2. Macro pour ajouter un nouvel élément dans un tableau
    Par dudu134 dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 21/02/2007, 16h31
  3. Réponses: 26
    Dernier message: 20/06/2006, 14h56
  4. Réponses: 4
    Dernier message: 14/06/2006, 17h22
  5. Libérer des pointeurs dans une std::map
    Par GaldorSP dans le forum SL & STL
    Réponses: 2
    Dernier message: 09/07/2005, 14h42

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