我有一个包含3个元素的std :: map,我试图查看地图中是否存在某个键。我已经将地图放在调试器中,它包含添加到它的所有3个元素。当使用find时,它会在第一个元素后停止并且immediatley返回map.end()...我甚至确保覆盖运算符<在关键。任何人都知道为什么在第一把钥匙后停止查找?
这是运营商<关键:
bool MyClass::operator<(const MyClass& myClass) const
{
bool aIsEqual = a == myClass.a || a == "0" || myClass.a == "0";
bool bIsEqual = b == myClass.b || b == "0" || myClass.b == "0";
bool cIsEqual = c == myClass.c || c == "0" || myClass.c == "0";
return !aIsEqual || !bIsEqual || !cIsEqual;
}
答案 0 :(得分:1)
std::map
是标准第23.2.4节中定义的关联容器之一。
在为这些容器实现operator<
或Compare
对象时,您必须牢记一些限制因素:
- 每个关联容器都在
Key
上进行参数化,并且排序关系Compare
会导致严格的弱排序(25.4)Key
的元素。 (...)- 短语“等价键”表示 比较强加的等价关系而不是运算符== 在钥匙上。也就是说,两个键
醇>k1
和k2
被认为是 对于比较对象comp
,comp(k1, k2) == false && comp(k2, k1) == false
,等效。对于同一个中的任意两个键k1
和k2
容器,调用comp(k1, k2)
应始终返回相同的值。
在您的情况下,您未能满足这些条件(例如订购),因此地图的“不良”行为。
答案 1 :(得分:0)
在不确切知道您的a
,b,
和c
成员实际代表什么的情况下,我只能猜测,但我认为您的运营商应该看起来更像这样:< / p>
bool MyClass::operator<(const MyClass& myClass) const
{
if ((a < myClass.a) || ((a == "0") && (myClass.a != "0")))
return true;
if (a == myClass.a)
{
if ((b < myClass.b) || ((b == "0") && (myClass.b != "0")))
return true;
if (b == myClass.b)
return ((c < myClass.c) || ((c == "0") && (myClass.c != "0")));
}
return false;
}