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

时间:2011-03-21 13:48:48

标签: c++ stl std multimap

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

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)元素确实位于multimap中时,我得到了multimap中最后一个元素的迭代器,这意味着在multimap中找不到给定元素。

您是否知道为何会发生这种情况? 不知何故,我认为它与我在结构中定义的比较运算符相关,后来我用于多图构造,但我不知道究竟是为什么。此处还有GUID类型的定义:

GUID

正如您所看到的,我在比较函数中使用了typedef struct _GUID { unsigned long Data1; unsigned short Data2; unsigned short Data3; unsigned char Data4[ 8 ]; } GUID; Data1Data2,但之后没有使用Data3 Data4数组我没有看到任何合理的方法来比较char的那一部分。

2 个答案:

答案 0 :(得分: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;

答案 1 :(得分: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;
    }