2011-03-21 3 views
1

Je souhaite utiliser std::multimap dont les clés et les valeurs sont de type GUID. Pour cela, j'avais besoin de définir l'opérateur de comparaison. Voici le related question.Problème avec count() et find() dans std :: multimap

struct GUIDPairsComparer 
{ 
    bool operator()(const GUID &left, const GUID &right) const 
    { 

     if (left.Data1 < right.Data1) 
     return true;  
     if (left.Data2 < right.Data2) 
     return true; 
     if (left.Data3 < right.Data3) 
     return true; 

     return false; 

    } 
}; 

Class A{ 

    private: 
     multimap<GUID, GUID, GUIDPairsComparer> myMap; 
     multimap<GUID, GUID, GUIDPairsComparer>::iterator it_myMap; 

    public: 
     FunctionUsingMultiMap(){...} 

}; 

Mais, j'ai des difficultés lors de l'utilisation myMap.count(GUID x) et myMap.find(GUID x). L'utilisation de myMap.count(GUID x) produit une exception, alors que lorsque j'utilise myMap.find(GUID x) avec l'élément GUID que je connais bien dans le multimap, j'obtiens l'itérateur au dernier élément de multimap, ce qui signifie que l'élément donné n'est pas trouvé dans multimap.

Avez-vous, par tous les moyens, une idée pourquoi cela se produit-il?
D'une certaine manière je pense que c'est lié à l'opérateur de comparaison que j'ai défini dans la structure que j'utilise ensuite pour la construction multimap, mais je ne sais pas exactement pourquoi. Aussi voici une définition de type GUID:

typedef struct _GUID { 
    unsigned long Data1; 
    unsigned short Data2; 
    unsigned short Data3; 
    unsigned char Data4[ 8 ]; 
} GUID; 

Comme vous pouvez le voir, je l'ai utilisé Data1, Data2 et Data3 en fonction de comparaison, mais ne pas utiliser Data4 tableau char puisque je ne vois aucune logique façon de comparer cette partie de GUID.

Répondre

5

Votre opérateur de comparaison a tort - il ne répond pas à un ordre très strict.

if (left.Data1 < right.Data1) 
    return true; 
else if (left.Data1 > right.Data1) 
    return false; 
if (left.Data2 < right.Data2) 
    return true; 
else if (left.Data2 > right.Data2) 
    return false;  
if (left.Data3 < right.Data3) 
    return true; 
else if (left.Data3 > right.Data3) 
    return false; 
return memcmp(left.Data4, right.Data4, 8) < 0; 
2
bool operator<(const GUID & Left, const GUID & Right) 
    { 
     if(Left.Data1 == Right.Data1) 
     { 
      if(Left.Data2 == Right.Data2) 
      { 
       if(Left.Data3 == Right.Data3)    
        return (memcmp(left.Data4, right.Data4, 8) < 0);         
       else 
        return Left.Data3 < Right.Data3; 
      } 
      else 
       return Left.Data2 < Right.Data2; 
     } 
     else 
      return Left.Data1 < Right.Data1; 
    } 
Questions connexes