【问题标题】:Can I override std::hash?我可以覆盖 std::hash 吗?
【发布时间】:2013-08-07 09:19:10
【问题描述】:

我可以用我自己在 C++ 11 中定义的 std::hash 替换 std::hash 的实际实现吗?

我的意思是来自我的代码库,而不涉及标准库。

在这种情况下,我看不到虚函数/多态性的任何用途,所以我想我无论如何都不能改变 std::hash 的定义?

【问题讨论】:

标签: c++ c++11 hashtable stdhash


【解决方案1】:

您可以针对特定类型专门化散列。 请参阅herehere,例如像这样

namespace std {
  template <> struct hash<Foo>
  {
    size_t operator()(const Foo & x) const
    {
      /* your code here, e.g. "return hash<int>()(x.value);" */
    }
  };
}

如果你认为你可以比现有版本的库实现者做得更好,你要么 1.错误 要么 2. 聪明

【讨论】:

  • 3. lazy ,所以不用写X个新类型就可以得到一个新的hash函数。
  • “X 种新类型”?只需编写一个 myHash 函数并使用它,但这可能并不懒惰 - 你必须先阅读 Knuth 几个小时才能正确使用它。
  • 懒惰的部分确实是关于“写作” :D 但感谢 Tex 的创建者和其他大量算法和书籍的参考。
【解决方案2】:

是的,没关系,你不必以任何方式修改标准库,只需使用模板专业化:

namespace std
{
    template<>
    struct hash<YourSpecialType>
    {
        // ...
    };
}

【讨论】:

  • @user2485710 啊,那么不。然后你就有了标准库。
  • @user2485710:散列函数的全局替换没有多大意义。它会完成什么?
  • @Xeo 只需一步即可更改任何结构使用的哈希函数。
  • @user2485710 如何在 C++ 中为任意类型实现std::hash? (提示:它不起作用)
  • 你可以用不同的名字来实现类型,比如struct HashInt{},并指定它的使用位置,例如unordered_map
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-19
  • 1970-01-01
相关资源
最近更新 更多