是否存在标准名称/模板原型"全等哈希" vs"身份哈希"?

时间:2014-06-18 09:59:54

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

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

我想制作一个覆盖哈希函数和等式谓词的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 ::中已经存在的这个或原型的命名有先例吗?我考虑过像isomorphiccongruent这样的字词。当你有多个关于它意味着什么的概念时,它似乎经常会出现在设计课程中。#/ p;

1 个答案:

答案 0 :(得分:0)

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

通过这种方式,您可以正确实现该类型的std :: functions ...并在集合中使用它,而无需传递这些额外的谓词。因此,可能使用指针等式语义FooRef调用类型,并使用值语义Foo调用该类型。

如果出于某种原因你不能这样做......那么看一下你想要并行的名字:

  • std::equal_to<Key>

  • std::hash<Key>

保持equal_tohash可能与“标准”最接近。因此,不要引入像congruenceisometric这样的新术语,而是要确切地说出相等或散列的内容......并使用上面的后缀作为后缀:

  • std::content_equal_to<Key>

  • std::content_hash<Key>

如果是比较某些内容的“结构”,您可以将其应用于structure_equal_tostructure_hash。唯一需要注意的是“结构”/“结构”在C ++中具有意义,因此它可能会引导读者认为它正在比较type_info或类似的内容。