std :: map.find()停在第一个元素?

时间:2015-08-11 21:25:45

标签: c++ dictionary stl

我有一个包含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;
}

2 个答案:

答案 0 :(得分:1)

std::map是标准第23.2.4节中定义的关联容器之一。 在为这些容器实现operator<Compare对象时,您必须牢记一些限制因素:

  
      
  1. 每个关联容器都在Key上进行参数化,并且排序关系Compare会导致严格的弱排序(25.4)   Key的元素。 (...)
  2.   
  3. 短语“等价键”表示   比较强加的等价关系而不是运算符==   在钥匙上。也就是说,两个键k1k2被认为是   对于比较对象compcomp(k1, k2) == false && comp(k2, k1) == false,等效。对于同一个中的任意两个键k1k2   容器,调用comp(k1, k2)应始终返回相同的值。
  4.   

在您的情况下,您未能满足这些条件(例如订购),因此地图的“不良”行为。

答案 1 :(得分:0)

在不确切知道您的ab,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;
}