2010-09-19 4 views
2

ce sont les cartes:C++: Comment transformer un iterator carte qui pointent vers apparier en un pointeur de paire « régulière »

multimap<SortKey,T> firstMap; 
multimap<SearchKey,pair<SortKey,T>*> secondMap; 


template <class T,class SortKey, class SearchKey> bool GarageDataBase<T,SortKey,SearchKey>::Add(T data,SortKey key1, SearchKey key2) 
{ 
multimap<SortKey,T>::iterator it; 
it=(firstMap.insert(pair<SortKey,T>(key1,data))); 
pair<SortKey,T> *mizi=&*it; 

secondMap.insert(pair<SearchKey,pair<SortKey,T>*>(key2,mizi)); 
return true; 
} 

Je suis en train d'insérer une paire dans la firstMap et obtenir un pointeur vers cette Paire et l'insérer dans le "second" champ dans le secondMap

afin que je puisse aller dans ma première carte de la deuxième carte.

pair<SortKey,T> *mizi=&*it; 

cela ne compile pas en disant:

error C2440: 'initializing' : cannot convert from 'std::pair<_Ty1,_Ty2> *' to 'std::pair<_Ty1,_Ty2> *' 

une idée ce qui se passe ou peut-être une meilleure façon de le faire fonctionner?

Répondre

2

pair<SortKey,T> est différent de multimap<SortKey,T>::value_type. Ce dernier est pair<const SortKey,T> puisque la clé n'est pas censée changer. Et puisque pair<SortKey,T> et pair<const SortKey,T> ne sont pas liés à la référence, mais deux types distincts, le compilateur n'accepte pas le code. Si vous tenez compte de la clé const, cela devrait fonctionner.

+0

J'ai ajouté le const, donne toujours le même problème – Nadav

+0

voici le code: – Nadav

+0

ok, cela l'a corrigé, merci – Nadav

0
pair<const SortKey,T> *mizi=new pair<const SortKey,T>; 
    it=(firstMap.insert(pair<SortKey,T>(key1,data))); 
    mizi=&*it; 

    secondMap.insert(pair<SearchKey,pair<const SortKey,T>*>(key2,mizi)); 
    return true; 

Ok après l'avoir modifié à Const en insert et dans le multimap il semble fonctionner

+0

Vous avez une fuite de mémoire ici. Vous allouez une paire en utilisant new et ne la supprimez jamais. – rlbond

+0

Ceci est juste un exemple de code pour tester ce que j'ai demandé, je ne vais pas l'utiliser sans supprimer toutes les allocations, mais merci – Nadav

0

Il serait plus facile à utiliser:

multimap<SortKey,T> firstMap; 
multimap<SearchKey,firstMap::iterator> secondMap; 


template <class T,class SortKey, class SearchKey> 
bool GarageDataBase<T,SortKey,SearchKey>::Add(T data,SortKey key1, SearchKey key2) 
{ 
    firstMap::iterator it; 
      =firstMap.insert(firstMap::value_type(key1,data)); 
    secondMap.insert(secondMap::value_type(key2,it)); 
    return true; 
} 

Cela présente plusieurs avantages: 1. don Ne doit pas connaître la représentation interne des types multimap 2. Ne peut pas faire quelque chose de stupide comme l'incrémentation des pointeurs mais sinon la syntaxe est la même SortKey sortkey = secondMap.find (mer rchkey) -> second-> premier;

Questions connexes