2011-03-21 47 views
1

我想用std::multimap,其键和值都是GUID型。为此,我需要定义比较运算符。这里是related question问题的计数()和find()中的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(){...} 

}; 

但是,我使用myMap.count(GUID x)myMap.find(GUID x)时有困难。 使用myMap.count(GUID x)产生异常,而当我用myMap.find(GUID x)GUID元素,我知道肯定是在multimap中,我得到的迭代器在多重映射的最后一个元素,这意味着给定的元素是不是在multimap中找到。

你以任何方式,有一个线索,为什么会出现这种情况?
不知怎的,我认为这是关系到我在这之后,我使用多重映射建筑结构定义比较操作,但我完全不知道为什么。另外这里的GUID类型的定义:

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

正如你所看到的,我在比较功能使用Data1Data2Data3,但没有使用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; 
    }