【问题标题】:Is there a standard name / templated prototype for "congruent hash" vs "identity hash"?“全等哈希”与“身份哈希”是否有标准名称/模板原型?
【发布时间】:2014-08-08 13:48:34
【问题描述】:

我有一个模板类 Foo 可以进行身份​​比较(通过 ==),但有一个函数 Foo::sameStructureAs(Foo const & other) 用于更多的“值”与“指针”的平等概念。

我想创建一个unordered_map,它会覆盖散列函数和相等谓词。它们默认为std::equal_to<Key> 和std::hash<Key>...我根据身份为我的类型提供。但我需要他们根据我的sameStructureAs 进行比较。

由于 Foo 是一个模板,我做这样的事情:

template <class> struct same_structure_as;

template <class> struct hash_structure;

template <class T>
struct hash_structure<Foo<T>>
{
    size_t operator() (Foo<T> const & value) const
    {
        // whatever...
    }
};

template <class T>
struct same_structure_as<Foo<T>>
{
    bool operator() (Foo<T> const & left, Foo<T> const & right) const
    {
        // whatever...
    }
};

为此,我似乎大致遵循std:: 中的类的策略,并创建了一些通用的东西。那看起来对吗?

其次:这个或者std::中已经存在的原型的命名有没有先例?我想过像isomorphic 或congruent 这样的词。当您对“平等”的含义有不止一个想法时,这似乎是在设计课程时经常出现的东西。

【问题讨论】:

    标签: c++ hash std naming unordered-map


    【解决方案1】:

    如果您通过比较或相等的这种“不同”概念来查看类型,请询问您真正需要的是另一种类型。也许您会对基础数据应用某种类型的强制转换或强制,以便其相等/赋值/比较的新概念适合您正在设计的这个测试。

    这样您就可以正确实现该类型的 std:: 函数...并在集合中使用它,而无需传递这些额外的谓词。所以也许调用具有指针相等语义的类型FooRef 和具有值语义的类型Foo。

    如果由于某种原因你不能做到这一点......那么看看一个想要平行的名字:

    • std::equal_to&lt;Key&gt;

    • std::hash&lt;Key&gt;

    将equal_to 和hash 保留在其中可能是最接近“标准”的方法。因此,与其引入congruence 或isometric 之类的新术语,不如准确地指出相等或被散列的内容......并将上述内容用作后缀:

    • std::content_equal_to&lt;Key&gt;

    • std::content_hash&lt;Key&gt;

    如果它是被比较事物的“结构”,您可以将其应用于structure_equal_to 和structure_hash。唯一需要注意的是,“struct”/“structure”在 C++ 中是有意义的,所以它可能会让读者认为它是在比较 type_info 或类似的东西。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-05-27
      • 1970-01-01
      • 1970-01-01
      • 2014-08-27
      • 2017-04-25
      • 2013-04-24
      • 2011-03-20
      • 2019-10-22
      相关资源
      最近更新 更多