std :: multimap中count()和find()的问题

dra*_*vic 1 c++ stl std multimap

我想使用std::multimap其键和值是类型的GUID.为此,我需要定义比较运算符.这是相关的问题.

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

};
Run Code Online (Sandbox Code Playgroud)

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

无论如何,你是否知道为什么会这样?
不知何故,我认为它与我在结构中定义的比较运算符相关,后来我用于多图构造,但我不知道究竟是为什么.这里还有一个GUID类型的定义:

typedef struct _GUID {
    unsigned long  Data1;
    unsigned short Data2;
    unsigned short Data3;
    unsigned char  Data4[ 8 ];
} GUID;
Run Code Online (Sandbox Code Playgroud)

正如你所看到的,我已经使用了Data1,Data2并且Data3在比较函数中,但没有使用Data4 char数组,因为我没有看到任何逻辑方式来比较那部分GUID.

Eri*_*rik 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;
Run Code Online (Sandbox Code Playgroud)