首页 文章

重载ObjC结构为C无序容器哈希支持

提问于
浏览
0

我创建了 std::unordered_map<CGPoint, unsigned int> ,显然,要使它工作,我应该为它编写哈希函数:

namespace std {
    template<> struct hash<CGPoint> {
        inline size_t operator()(const CGPoint & v) const {
            size_t seed = 0;
            ::hash_combine(seed, v.x);
            ::hash_combine(seed, v.y);
            return seed;
        }
    };
};

但它没有编译,我发现有一个地方,应该定义相等运算符 . 所以我将以下代码写入模板结构中 .

friend bool operator==(const CGPoint& p1, const CGPoint& p2) {
    return (p1.x == p2.x) && (p1.y == p2.y);
}

但它不断抛出异常:

/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include/c / v1 / functional:659:21:二进制表达式的无效操作数('const CGPoint'和'const CGPoint')

和:

/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include/c / v1 / __ hash_table:1993:32:没有匹配函数来调用'key_equal'类型的对象(又名'std ::' __1 :: __ unordered_map_equal,std :: __ 1 :: equal_to,true>')

很可能我错过了一些非常简单的东西,但是因为它经常发生,我无法得到它 . 提前致谢 .

1 回答

  • 2

    operator== 应该是顶级功能,而不是朋友功能 .

    以下将编译:

    namespace std {
        template<> struct hash<CGPoint> {
            inline size_t operator()(const CGPoint & v) const {
                size_t seed = 0;
                ::hash_combine(seed, v.x);
                ::hash_combine(seed, v.y);
                return seed;
            }
        };
    };
    
    bool operator==(const CGPoint& p1, const CGPoint& p2) {
        return (p1.x == p2.x) && (p1.y == p2.y);
    }
    
    int main() {
        std::unordered_map<CGPoint, unsigned int> map;
        map[CGPointMake(1, 1)] = 1;
        return 0;
    }
    

相关问题