2010-09-04 4 views
0

bonjour j'ai un itérateur fonctionnant sur un multimap, mon multimap comprend deux champs le premier 1 est la valeur clé qui est une chaîne nom et le second 1 est la donnée qui est un pointeur vers un objet appelé Employee. dans mon programme, je dois être capable de trouver un élément dans ma carte en utilisant l'itérateur (parce que j'essaie de trouver les données par son ID et non par la valeur de la clé). Je veux avoir une sorte d'indicateur qui me dira si l'élément que je cherche est dans ma carte ou non. merci d'avance. et voici mon code Rechercher:itérateur pour la carte - problème avec la recherche

MultiMap::iterator iterator; 
iterator=m_municipalityMap.begin(); 
bool flag = false; 
while(!(flag) && iterator != m_municipalityMap.end()) 
{ 
    if(strcmp(iterator->second->GetId() , id) == 0) 
    { 
     flag=true; 
     break; 
    } 
    iterator++; 
} 
if (flag==false) 
    cout << "could not find Employee"<<endl; 

return iterator; 

ce que je dois savoir s'il y a un moyen de savoir si l'itérateur se tient sur rien comme comparer à NULL sur les pointeurs

+0

Juste un petit commentaire: utiliser '+ + iterator' au lieu de 'iterator ++'. – Wok

+0

Quelques commentaires: comme l'a souligné Kirill, cette solution n'est pas évolutive. 2: utilisez std :: string si possible. 3: ne pas vérifier le drapeau si vous utilisez le break. 3: préfèrent pour plus longtemps. Je ne vois aucune erreur évidente dans votre code, alors vérifiez en affichant Id et GetId() dans votre boucle. – stefaanv

+0

J'utilise le drapeau parce que j'ai besoin de m'indiquer si j'ai trouvé l'article ou non –

Répondre

0

Si vous avez besoin de deux clés dans la conteneur, vous pouvez essayer Boost Multi-index Container.

Une autre solution consiste à créer deux cartes, chacune avec une clé propre, et de conserver vos données dans chaque pointeur (intelligent).

+0

savez-vous si le compilateur linux contient cette librairie? –

+0

Presque toutes les distributions Linux modernes contiennent Boost. –

+0

la chose est que j'ai tout mon programme trié et j'ai eu un petit problème avec cet itérateur probablement il devrait y avoir une solution facile pour mon problème je préfère ne pas essayer boost encore merci pour votre commentaire –

1

Vous pouvez utiliser l'algorithme std :: find_if avec un prédicat approprié qui gérera votre employé en fonction de l'ID.

Ceci est une adaptation d'un exemple trouvé dans "La bibliothèque standard C++ - Un tutoriel et référence" par Nicolai M. Josuttis, Addison-Wesley, 1999:

class value_id_equals 
{ 
private: 
    string m_id; 
public: 
    // constructor (initialize id to compare with) 
    value_id_equals (string id) 
     : m_id(id) { } 
    // comparison 
    bool operator() (pair<string, Employee*> elem) 
    { 
     return (!strcmp(elem.second->GetID(), m_id.c_str())); 
    } 
}; 

... 
pos = find_if(your_map.begin(),your_map.end(), // linear complexity 
       value_id_equals(theID)); 
+0

'return (! Strcmp (elem.second-> GetID(), m_id.c_str()))' devrait être écrit comme 'return elem.second-> GetID() == m_id;' – user102008

+0

IL POURRAIT être écrit comme cette. Ou même en utilisant la fonction de comparaison de la chaîne std :: string. Mais savez-vous que GetID() retournera une chaîne std :: string? Comment sais-tu ça? J'ai utilisé le contexte de l'OP, c'est-à-dire qu'il utilisait strcmp, ce qui signifiait que son GetID renvoyait un char *. La question ne portait pas sur strcmp versus std :: string compare. – celavek