繁体   English   中英

使用自定义键的C ++地图插入错误

[英]c++ map insertion error with custom key

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

map<>根据“ 严格弱排序”对键进行排序 严格的弱排序仅基于小于类型的比较。 (单击链接获得完整定义。)

值得注意的是,如果!(a < b) && !(b < a)map<>依赖于该属性,则严格弱排序将对象a和b视为等效

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

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

顺便说说,

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM