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 :

insertion dans une MAP


Sujet :

C++

  1. #1
    Membre confirm�
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Juin 2012
    Messages
    56
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activit� : D�veloppeur informatique
    Secteur : Distribution

    Informations forums :
    Inscription : Juin 2012
    Messages : 56
    Par d�faut insertion dans une MAP
    Bonjour � tous,

    je rencontre des probl�mes pour ins�rer des donn�es avec un it.first d�j� existant dans une map. J'ai essay� de synth�tiser et simplifier au maximum le besoin.

    Exemple:

    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
    33
    34
    35
    36
    37
    38
    39
    40
    41
    #pragma once
     
    #include <string>
    #include <vector>
    #include <map>
     
    struct example
    {
    	int id;
    	std::string name;
    };
     
    struct data
    {
    	int number;
    	std::string string;
    };
     
    class c
    {
    	private:
    	std::map<example, std::vector<data>> m;
     
    	public:
    	void add(example &ex)
    	{
    		data d;
    		bool state = false;
    		for (const auto& its : m)
    		{
    			if (its.first.id == ex.id)
    			{
    				m[its.first].push_back(d);
    				//m_.emplace(std::make_pair(its.first, d));
    				state = true;
    				break;
    			}
    		}
    		if (!state) m.emplace(std::make_pair(ex, d));
    	}
    };
    Merci bien.

  2. #2
    R�dacteur/Mod�rateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 153
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 38
    Localisation : Canada

    Informations professionnelles :
    Activit� : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 153
    Billets dans le blog
    4
    Par d�faut
    Quel est le probl�me ?
    Pourquoi ne pas simplement faire m[ex.id].push_back(d); ? L'op�rateur [] de la map commence par cr�er la valeur si elle n'existe pas.
    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.

  3. #3
    Membre confirm�
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Juin 2012
    Messages
    56
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activit� : D�veloppeur informatique
    Secteur : Distribution

    Informations forums :
    Inscription : Juin 2012
    Messages : 56
    Par d�faut
    Bonjour Bousk,

    �a ne compile pas ! et les erreurs ne sont pas du tout explicites et me renvoient dans xutility et xstddef.

    Le but �tant de faire un test sur un champ (id) et de stocker l'int�gralit� de la structure dans la map.

    En fait je ne vois rien d'anormal, je me demande si le soucis ne viendrait pas d'ailleurs.

  4. #4
    Expert confirm�
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    F�vrier 2005
    Messages
    5 503
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 53
    Localisation : France, Val de Marne (�le de France)

    Informations professionnelles :
    Activit� : D�veloppeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : F�vrier 2005
    Messages : 5 503
    Par d�faut
    les erreurs ne sont pas du tout explicites
    Pour vous.
    Laissez-nous en juger.
    Les messages d'erreur, SVP.

  5. #5
    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
    pour moi, le probl�me pourrait bien �tre que tu n'as pas d�fini operator <, au moins dans le code que tu nous montres.

  6. #6
    Membre �prouv�
    Inscrit en
    Mai 2012
    Messages
    65
    D�tails du profil
    Informations forums :
    Inscription : Mai 2012
    Messages : 65
    Par d�faut
    Si tu veux stocker ta class example dans ta map, il faut que tu d�finise un op�rateur de comparaison (� mettre en fonction libre):
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
     
    //trie sur l'id
    bool operator< (const example & e1, const example & e2)
    {
    	return e1.id < e2.id;
    }
    Et tu peux utiliser ta map comme ceci :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
     
    std::map<example, std::vector<data>> m;
    example e{1, "toto"};
     
    data d{5, "titi"};
     
    m[e].push_back(d);

  7. #7
    Membre confirm�
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Juin 2012
    Messages
    56
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activit� : D�veloppeur informatique
    Secteur : Distribution

    Informations forums :
    Inscription : Juin 2012
    Messages : 56
    Par d�faut
    Bonjour,

    En effet, le probl�me viendrait de l'absence de la surcharge d'op�rateur.

    :\program files (x86)\microsoft visual studio 14.0\vc\include\xstddef(239): error C2678: '<' binaire*: aucun op�rateur trouv� qui accepte un op�rande de partie gauche de type 'const Event' (ou il n'existe pas de conversion acceptable)
    1> c:\program files (x86)\microsoft visual studio 14.0\vc\include\system_error(436): note: est peut-�tre 'bool std::operator <(const std::error_condition &,const std::error_condition &) noexcept'
    1> c:\program files (x86)\microsoft visual studio 14.0\vc\include\system_error(427): note: ou 'bool std::operator <(const std::error_code &,const std::error_code &) noexcept'
    1> c:\program files (x86)\microsoft visual studio 14.0\vc\include\xstddef(239): note: lors de la tentative de mise en correspondance de la liste des arguments '(const Event, const Event)'
    1> c:\program files (x86)\microsoft visual studio 14.0\vc\include\xstddef(238): note: lors de la compilation de la fonction membre '<Inconnu>' de la classe <Inconnu>
    1> c:\program files (x86)\microsoft visual studio 14.0\vc\include\xutility(812): note: voir la r�f�rence � l'instanciation de la fonction mod�le 'bool std::less<_Kty>::operator ()(const _Ty &,const _Ty &) const' en cours de compilation
    Oui mais le fait de cr�er une fonction libre aura forc�ment de gros impacts sur la solution, il faut prendre en compte les effets de bords.. et �a ne compile toujours pas (erreurs de linkage).

  8. #8
    R�dacteur/Mod�rateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 153
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 38
    Localisation : Canada

    Informations professionnelles :
    Activit� : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 153
    Billets dans le blog
    4
    Par d�faut
    L'erreur est plut�t claire effectivement.
    Citation Envoy� par bowow Voir le message
    Oui mais le fait de cr�er une fonction libre aura forc�ment de gros impacts sur la solution, il faut prendre en compte les effets de bords.. et �a ne compile toujours pas (erreurs de linkage).
    Gros impacts ? Effets de bord d'une fonction libre d'op�rateur <, pour laquelle les param�tres sont sens�s �tre const& ?
    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.

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

    Informations professionnelles :
    Activit� : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par d�faut
    Salut,
    Citation Envoy� par bowow
    Oui mais le fait de cr�er une fonction libre aura forc�ment de gros impacts sur la solution, il faut prendre en compte les effets de bords.. et �a ne compile toujours pas (erreurs de linkage).
    A vrai dire, � part le fait que n'importe quelle unit� de compilation dans laquelle l'op�rateur < serait d�fini pour example pourrait l'utiliser, je ne vois pas vraiment de quels effets de bord tu veux parler. Comme les param�tres sont -- de toutes mani�res -- transmis sous forme de r�f�rence constante, il n'y a aucun effet de bord � craindre

    A moins, bien sur, que tu ne parle du fait de forcer la comparaison de ta structure example sur un de ses champs bien particulier!!!

    En effet, la d�finition de l'op�ateur < te forcerait � choisir la mani�re de comparer deux �l�ments de type example. Est-ce
    • au travers de la valeur du champs id ?
    • au travers de la valeur du champs name ?


    Et qu'il est vrai que ce choix aurait quelque chose de... d�finitif (comprends : identique et impos� dans toutes les unit�s de compilation ayant connaissance de la structure example)

    Et bien sur, le v�ritable probl�me est qu'aucune solution ne peut �tre consid�r�e comme meilleure : dans certains cas, tu voudras sans doute trier tes �l�ments uniquement par l'id, dans d'autres (c'est surement plus facile pour l'utilisateur) tu voudras les trier par nom.

    Mais des solutions existent, entre autres, parce que -- contrairement � ce que l'on croit g�n�ralement -- std::map est une collection template s'attendant � disposer de quatre param�tres template :
    il y a les deux que "tout le monde connait" (key et value), mais le troisi�me param�tre nous permet de d�finir le comparateur (qui �quivaut par d�faut � less<Key> et donc � l'op�rateur <), et le dernier 'allocator) param�tre nous permet de d�finir la politique de construction / destruction des �l�ments de la collection.

    Avant C++11, nous aurions pu �tre tent� d'utiliser des foncteurs qui auraient pu �tre proche de
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    struct LessById{
        bool operator()(example const & a, example const & b) const{
            return a.id < b.id;
        }
    };
    struct LessByName{
        bool operator()(example const & a, example const & b) const{
            return a.name < b.name;
        }
    };
    qui nous auraient alors permis d'utiliser le "tri par le champs id" dans notre std::map sous une forme proche de
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    std::map<example, std::vector<data>, LessById> m;
    ou, au contraire, de choisir le "tri par nom" dans notre std::map sous une forme proche de
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    std::map<example, std::vector<data>, LessByName> m;
    Et, dans le pire des cas, il resterait toujours possible d'envisager le recours � boost::bimap (si on souhaite vraiment avoir la possibilit� de disposer des deux tris simultan�ment )

    Ceci dit, il faut �tre bien consicent du fait que -- quoi qu'il arrive -- si ces deux foncteurs (et les modifications apport�e � la d�claration de la map) suffisent � permettre au code de compiler, la cl� de la map reste du type... example
    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

Discussions similaires

  1. Insertion d'un �l�ment vide dans une map.
    Par jamsgoodon dans le forum D�buter
    R�ponses: 2
    Dernier message: 24/03/2011, 13h51
  2. insertion dans une map
    Par salseropom dans le forum C++
    R�ponses: 5
    Dernier message: 14/09/2010, 01h39
  3. [POO] Insertion d'un template dans une map
    Par JSmey dans le forum Langage
    R�ponses: 6
    Dernier message: 27/11/2008, 11h50
  4. probl�me avec insert dans une map
    Par LePetitBricoleur dans le forum C++
    R�ponses: 3
    Dernier message: 01/11/2007, 11h52
  5. probl�me d'insertion de donn�es dans une map
    Par kifouillou dans le forum Collection et Stream
    R�ponses: 11
    Dernier message: 21/02/2007, 10h10

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