2011-03-21 7 views
1

キーと値がGUIDstd::multimapを使用します。そのためには、比較演算子を定義する必要がありました。ここにはrelated questionがあります。std :: multimapのcount()とfind()の問題

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(){...} 

}; 

しかし、myMap.count(GUID x)myMap.find(GUID x)を使用したとき、私は困難を持っています。 myMap.count(GUID x)を使用すると、myMap.find(GUID x)GUID要素をマルチマップに使用すると、マルチマップの最後の要素にイテレータが渡されます。つまり、指定された要素がマルチマップに見つかりません。

あなたは、どうしてこのことが起こっているのかを知っていますか?
どういうわけか私は構造体で定義した比較演算子に関連していると思います。後でマルチマップの構築に使用しますが、その理由はわかりません。また、ここGUID型の定義されて:あなたが見ることができるように、私は比較関数でData1Data2Data3

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

使用しましたが、私は任意の論理が表示されないので、Data4char配列を使用していませんでしたその部分を比較する方法GUID

答えて

5

あなたの比較演算子は間違っています。厳密な弱い順序を満たしていません。

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; 
    } 
関連する問題