使用自定义键的c ++ map插入错误

时间:2013-07-11 01:05:55

标签: c++

您好我定制的自定义键如下所示。当我创建一个std :: map时,我的印象是map将引用我的键中定义的operator ==来检测两个键是否相同,但它不是真的。能否请您指出正确的逻辑来消除此地图中的重复项?

class Key
{
public:
    Key(char * init, long l): equipNumber(l)
    {
            memcpy(initials, init, sizeof(initials));
    }

    bool operator==(const Key & other) const
    {
            bool result = true;
            cout << "Comparing: " << initials << " with " << other.initials;
            result &= (!memcmp(initials, other.initials, sizeof(initials)));
            cout << " And result is: " << result << endl;
            cout << "Comparing: " << equipNumber << " with " << other.equipNumber << endl;
            result &= (equipNumber == other.equipNumber);
            return result;
    }

    bool operator<(const Key & other) const
    {
            bool result = true;
            result &= (equipNumber < other.equipNumber);
            return result;
    }

private:
    char initials[5];
    long equipNumber;
};

2 个答案:

答案 0 :(得分:2)

map<>根据Strict Weak Ordering订购密钥。严格弱排序仅基于小于类型的比较。 (请点击链接获取完整定义。)

值得注意的是,Strict Weak Ordering认为对象a和b 等效如果!(a < b) && !(b < a)map<>依赖于该属性。

如果在创建地图时未向map<>提供比较功能,则其比较功能默认为std::less< Key >,这将调用您的operator<。这意味着它不会调用您的operator==,但会调用operator<。只要您的班级为LessThan Comparable,则std::less< Key >将遵守严格弱排序的属性。

答案 1 :(得分:2)

map两次调用operator <(或给定的比较函子)以确定相等性:! (a < b) && ! (b < a)隐含a == b。实际上,该对的第一个小于操作已经作为递归下降的一部分执行,因此没有太多(或任何)额外成本。它大大简化了自定义。

顺便说一下,

        bool result = true;
        result &= (equipNumber < other.equipNumber);
        return result;

应该只是return equipNumber < other.equipNumber;。涉及类型转换的操作与非成员重载更加一致,因此将二元运算符定义为friendclass {}块之外是一个好习惯。