我想使用其键和值类型为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;
,Data1
和Data2
,但之后没有使用Data3
Data4
数组我没有看到任何合理的方法来比较char
的那一部分。
答案 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;
}