2011-03-21 3 views
1

Я хочу использовать std::multimap, чьи ключи и значения имеют тип GUID. Для этого мне нужно было определить оператор сравнения. Вот related question.Проблема с count() и 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; 

Как вы можете видеть, я использовал Data1, Data2 и Data3 в функции сравнения, но не использовали 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; 
    } 

 Смежные вопросы

  • Нет связанных вопросов^_^