0

嗨,我定义了自定义键,如下所示。当我创建一个 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;
};
4

2 回答 2

2

Amap<>根据Strict Weak Ordering对键进行排序。严格弱排序仅基于小于类型比较。(点击链接获取完整定义。)

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

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

于 2013-07-11T01:10:16.010 回答
2

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

顺便一提,

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

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

于 2013-07-11T01:10:47.540 回答