【问题标题】:Problem with count() and find() in std::multimapstd::multimap 中的 count() 和 find() 问题
【发布时间】:2011-03-21 13:48:48
【问题描述】:

我想使用std::multimap,其键和值的类型为GUID。为此,我需要定义比较运算符。这是related question

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) 与我确定在multimap 中的GUID 元素一起使用时,我将迭代器获取到multimap 中的最后一个元素,这意味着找不到给定的元素在多地图中。

您是否知道为什么会发生这种情况?
不知何故,我认为它与我在结构中定义的比较运算符有关,之后我将其用于多图构建,但我不知道确切原因。这里还有GUID类型的定义:

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

如您所见,我在比较函数中使用了Data1Data2Data3,但没有使用Data4 char 数组,因为我看不到任何合乎逻辑的比较方法GUID的那部分。

【问题讨论】:

    标签: c++ stl std multimap


    【解决方案1】:

    您的比较运算符是错误的 - 它不满足严格的弱排序。

    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;
          }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-02-02
        • 1970-01-01
        • 1970-01-01
        • 2013-02-27
        • 2015-12-16
        • 1970-01-01
        • 2011-02-25
        相关资源
        最近更新 更多