gpt4 book ai didi

c++ - 如何为无序容器中的用户定义类型专门化 std::hash::operator()?

转载 作者:IT老高 更新时间:2023-10-28 11:56:33 31 4
gpt4 key购买 nike

std::unordered_set<Key> 中支持用户定义的键类型和 std::unordered_map<Key, Value>一个必须提供operator==(Key, Key)和一个哈希仿函数:

struct X { int id; /* ... */ };
bool operator==(X a, X b) { return a.id == b.id; }

struct MyHash {
size_t operator()(const X& x) const { return std::hash<int>()(x.id); }
};

std::unordered_set<X, MyHash> s;

只写std::unordered_set<X> 会更方便。带有类型 X默认哈希 ,就像编译器和库一起出现的类型。咨询后

  • C++ 标准 Draft N3242 §20.8.12 [unord.hash] 和 §17.6.3.4 [hash.requirements],
  • Boost.Unordered
  • g++ include\c++\4.7.0\bits\functional_hash.h
  • VC10 include\xfunctional
  • 各种related question s 在堆栈溢出中

似乎可以专门化 std::hash<X>::operator() :

namespace std { // argh!
template <>
inline size_t
hash<X>::operator()(const X& x) const { return hash<int>()(x.id); } // works for MS VC10, but not for g++
// or
// hash<X>::operator()(X x) const { return hash<int>()(x.id); } // works for g++ 4.7, but not for VC10
}

鉴于对 C++11 的编译器支持尚处于试验阶段——我没有尝试 Clang——,这些是我的问题:

  1. 在命名空间 std 中添加这样的特化是否合法? ?我对此有复杂的感觉。

  2. std::hash<X>::operator() 中的哪一个版本(如果有)是否符合 C++11 标准?

  3. 有便携的方法吗?

最佳答案

明确允许并鼓励您将 specializations 添加到命名空间 std*。添加哈希函数的正确(并且基本上是唯一的)方法是:

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

(您可能考虑支持的其他流行特化是 std::lessstd::equal_tostd::swap。)

*) 只要其中一种类型是用户定义的,我想。

关于c++ - 如何为无序容器中的用户定义类型专门化 std::hash<Key>::operator()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8157937/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com