我可以覆盖std::hash吗?

8
我能否在C++ 11中用自己的std :: hash定义替换实际实现,而不需要接触标准库?
我的意思是从我的代码库中操作,而不去修改标准库。
在这种情况下,我看不到虚函数/多态性有任何用处,因此我认为无论如何都不能更改std :: hash的定义。

1
你可以为自己的类型提供专门化。 - Xeo
@Xeo 是的,我知道那个,但是我对全局变化感兴趣。 - user2485710
2个回答

9

您可以为特定类型专门设计哈希。 例如,可以查看此处此处的内容。

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. 很聪明


1
_3. 惰性_,这样我就可以不用编写 X 个新类型来获得一个新的哈希函数。 - user2485710
“X个新类型”?只需编写一个myHash函数并使用它,但这可能不是懒惰的方式 - 您需要先阅读Knuth几个小时才能正确理解。 - doctorlove
懒惰的部分确实是关于“写作”的:D,但感谢提到Tex的创造者和其他无数算法和书籍的参考。 - user2485710

7

没问题,你不需要修改标准库,只需使用模板特化即可:

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

4
啊,那就不行了。那你需要分叉标准库。 - Some programmer dude
1
@user2485710:全局替换哈希函数没有多少意义,如果有的话它能够实现什么呢? - Xeo
@Xeo 只需一步操作即可更改任何结构所使用的哈希函数。 - user2485710
@user2485710,您如何在C++中为任意类型实现std::hash?(提示:它无法正常工作) - R. Martinho Fernandes
你可以使用不同的名称来实现类型,例如 struct HashInt{},并在使用它的地方指定它,例如 unordered_map<int, int, HashInt>。 - where23

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接