Проблема с count () и find () в std :: multimap - PullRequest
1 голос
/ 21 марта 2011

Я хочу использовать 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(){...}

};

Но у меня возникают трудности при использовании 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;

Как видите, я использовал Data1, Data2 и Data3 в функции сравнения, но не использовал *Массив 1023 * char, поскольку я не вижу логического способа сравнить эту часть GUID.

Ответы [ 2 ]

5 голосов
/ 21 марта 2011

Ваш оператор сравнения неверен - он не удовлетворяет строгому слабому порядку.

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 голосов
/ 21 марта 2011
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;
    }
...