1

std::multimapKeys と Values が type のものを使用したい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(){...}

};

しかし、 と の使用には問題がmyMap.count(GUID x)ありmyMap.find(GUID x)ます。を使用myMap.count(GUID x)すると例外が発生しますが、マルチマップにあることがわかっている要素を使用するmyMap.find(GUID x)GUID、マルチマップの最後の要素へのイテレータが取得されます。つまり、指定された要素がマルチマップに見つかりません。

どういうわけか、なぜこれが起こっているのか手がかりはありますか?
どういうわけか、後でマルチマップの構築に使用する構造で定義した比較演算子に関連していると思いますが、正確な理由はわかりません。GUIDまた、タイプの定義は次のとおりです。

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

ご覧のとおり、比較関数で と を使用しましたが、 のその部分を比較する論理的な方法が見当たらないため、配列は使用Data1Data2ませんでした。Data3Data4 charGUID

4

2 に答える 2

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;
于 2011-03-21T13:53:36.877 に答える
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;
    }
于 2011-03-21T14:08:14.283 に答える