c++ - "congruent hash"与 "identity hash"是否有标准名称/模板原型(prototype)?

标签 c++ hash std naming unordered-map

我有一个模板类 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::中已经存在的原型(prototype)的命名有没有先例?我想过像 isomorphic 这样的词或 congruent .当您对“平等”的含义有不止一种想法时,这似乎是在设计类时经常出现的问题。

最佳答案

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

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

如果由于某种原因你不能这样做......然后看看想要平行的名字:

  • std::equal_to<Key>

  • std::hash<Key>

保持equal_tohash其中可能最接近“标准”的人会完成。所以与其引入像congruence这样的新术语或 isometric , 准确指出什么是相等的或被散列的......并使用上面的作为后缀:

  • std::content_equal_to<Key>

  • std::content_hash<Key>

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

关于c++ - "congruent hash"与 "identity hash"是否有标准名称/模板原型(prototype)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24282609/

相关文章:

c++ - 显示文件中具有最少给定元音数的单词

c++ - 使用 stringstream 类试图按值传递?

c# - 基于 .net ComputeHash 的 SQL CLR 函数不适用于 Cyrillic

ruby-on-rails - ruby rails : reverse lookup of array list of values

c# - 创建一个隐藏 C# 中 int 值的安全哈希

c++ - 可以构造一个空的 std::optional<T> 调用 T 的默认构造函数吗?

c++ - 仅移动类型的 std::expected 的这种行为是 MSVC bug 还是未定义的行为?

c++ - 代码在 STLport_shared 上编译良好但在 gnuSTL_shared 上编译不正常

c++ - 用纯C++模糊图像

c++ - 在数据存储和全局变量之间做出决定