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 :

STL : utilisation d'une multimap


Sujet :

SL & STL C++

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    114
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 114
    Points : 56
    Points
    56
    Par défaut STL : utilisation d'une multimap
    Bonjour,

    je souhaite utiliser une multimap pour associer un chaine avec une classe comme montré ci dessous :
    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
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
     
    class CDataInfo  
    {
    public:
    	CDataInfo()  { };
    	~CDataInfo() { };
     
    	int			nSFID;
    	int			nRecNo;
    	int			nRecLen;
    	int			nRecOffset;
    	int			nDataType;
    	int			nDataLen;
    };
     
    typedef multimap<CString, CDataInfo>::iterator CDataListIter; 
    class CDataList
    {
    public:
    	CDataList() { m_It = NULL;};
    	~CDataList() { };
     
    	void Clear() { m_DataInfoList.clear(); }
     
    	void AddTag( CString strTag, int nSFID, int nRecNo, 
    		int nRecLen, int nRecOffset, int nDataType, int nDataLen)
    	{
    		m_DataInfo.nSFID = nSFID;
    		m_DataInfo.nRecNo = nRecNo;
    		m_DataInfo.nRecLen = nRecLen;
    		m_DataInfo.nRecOffset = nRecOffset;
    		m_DataInfo.nDataType = nDataType;
    		m_DataInfo.nDataLen = nDataLen;
     
    		m_DataInfoList.insert(strTag, DataInfo); ????????? ERREUR  DE COMPIL
     
     
     
    	}
     
     
     
    	CDataListIter GetHead() { return m_DataInfoList.begin();}	
    	CDataListIter GetTail() { return m_DataInfoList.end(); }
    	long		 GetSize()  { return m_DataInfoList.size(); }
     
     
     
    protected:
    	CDataInfo		m_DataInfo;
    	multimap<CString, CDataInfo>	m_DataInfoList;
    	CDataListIter	m_It;
    };


    J'ai une erreur de compilation :

    d:\projet en cours\borne_160805\carddata.h(152) : error C2664: 'class std::_Tree<class CString,struct std::pair<class CString const ,class CDataInfo>,struct std::multimap<class CString,class CDataInfo,struct std::less<class CString>,class std::alloc
    ator<class CDataInfo> >::_Kfn,struct std::less<class CString>,class std::allocator<class CDataInfo> >::iterator __thiscall std::multimap<class CString,class CDataInfo,struct std::less<class CString>,class std::allocator<class CDataInfo> >::insert(cl
    ass std::_Tree<class CString,struct std::pair<class CString const ,class CDataInfo>,struct std::multimap<class CString,class CDataInfo,struct std::less<class CString>,class std::allocator<class CDataInfo> >::_Kfn,struct std::less<class CString>,clas
    s std::allocator<class CDataInfo> >::iterator,const struct std::pair<class CString const ,class CDataInfo> &)' : cannot convert parameter 1 from 'class CString' to 'class std::_Tree<class CString,struct std::pair<class CString const ,class CDataInfo
    >,struct std::multimap<class CString,class CDataInfo,struct std::less<class CString>,class std::allocator<class CDataInfo> >::_Kfn,struct std::less<class CString>,class std::allocator<class CDataInfo> >::iterator'
    No constructor could take the source type, or constructor overload resolution was ambiguous

    Et je ne comprends pas exactement pourquoi la syntaxe n'est pas bonne.

  2. #2
    Expert éminent sénior

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 752
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 752
    Points : 10 681
    Points
    10 681
    Billets dans le blog
    3
    Par défaut
    essaye
    m_DataInfoList.insert(strTag, DataInfo());

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    114
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 114
    Points : 56
    Points
    56
    Par défaut
    Citation Envoyé par Aurelien.Regat-Barrel
    essaye
    m_DataInfoList.insert(strTag, DataInfo());
    heu pardon en fait c'est

    m_DataInfoList.insert(strTag, m_DataInfo) mais ca marche pas mieux

  4. #4
    Expert éminent sénior
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Points : 13 926
    Points
    13 926
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    m_DataInfoList.insert(pair<CString, CDataInfo>(strTag, m_DataInfo));
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
       CDataList() { m_It = NULL;};
    Pourquoi ? De plus, ceci devrait poser qq problèmes
    Publication : Concepts en C

    Mon avatar : Glenn Gould

    --------------------------------------------------------------------------
    Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    109
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 109
    Points : 121
    Points
    121
    Par défaut
    Yop

    Essaie ce truc d'école, chez moi ça marche. tu pourras l'appliquer à ton prog .

    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
     
    #include <iostream>
    #include <map>
     
    using namespace std;
     
    int main() {
     
    multimap<char,int>m;
     
    // avec make_pair
    m.insert(make_pair('c',8));
    m.insert(make_pair('p',12));
     
    multimap<char,int> :: iterator it=m.begin();
     
    // Ici, tu affiches (enfin t'avais compris :) )
    while (it != m.end()) {
              cout << (*it).first << " " << (*it).second << endl;
              ++it; }
     
    }
    Je fais comme ça pour insérer dans une multimap.

    Sinon 2 ou 3 choses :
    - Il faut surdéfinir l'opérateur < s'il y a des classes en clé.
    - Je sais que certain compilos exigent le #include<multimap> (des vieux??)

    Bon courage [/code]

  6. #6
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Effectivement, insert ne prend pas les deux paramètres séparément, mais en un seul (une paire <clé, valeur>). Il faut donc utiliser make_pair, ou alors si tu ne te trouves pas dans une fonction membre constante, plus simplement l'opérateur [] :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    m_DataInfoList[strTag] = m_DataInfo;

  7. #7
    Membre averti
    Avatar de David Fleury
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    253
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 253
    Points : 307
    Points
    307
    Par défaut
    Bonjour,

    pour make_pair, il faudrait ajouter #include <utility> pour être sûr.

    Sinon, operator[] sur un multimap existe ?
    sauf erreur, je ne crois pas.


    Cordialement.

  8. #8
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Oups... J'avais zappé le fait qu'il s'agissait d'un multimap.

    Desolé

Discussions similaires

  1. Réponses: 7
    Dernier message: 29/04/2007, 10h37
  2. Réponses: 5
    Dernier message: 26/05/2005, 15h40
  3. Utilisation d'une variable sur plusieurs unités
    Par Yamaneko dans le forum Langage
    Réponses: 2
    Dernier message: 05/06/2003, 11h23
  4. Utilisation d'une dll écrite en delphi 5 dans VB6
    Par Jean-Louis dans le forum Langage
    Réponses: 4
    Dernier message: 05/08/2002, 09h19
  5. Réponses: 4
    Dernier message: 05/06/2002, 14h35

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