(1)为什么不叫hash_*,例如 hash_map hash_set ...
Since there was no hash table defined in the C++ standard library, different implementors of the standard libraries would provide a non-standard hash table often named hash_map
. Because these implementations were not written following a standard they all had subtle differences in functionality and performance guarantees.
Starting with C++11 a hash table implementation has been added to the C++ standard library standard. It was decided to use an alternate name for the class to prevent collisions with these non-standard implementations and to prevent inadvertent use of the new class by developers who had hash_table
in their code.
The chosen alternate name is unordered_map
which really is more descriptive as it hints at the class's map interface and the unordered nature of its elements.
In order to use custom objects in std::unordered_map, a custom hash function must be defined. This function takes a const reference to the custom type and returns a size_t
<span style="font-size:14px;">struct X{int i,j,k;};
struct hash_X{
size_t operator()(const X &x) const{
return hash<int>()(x.i) ^ hash<int>()(x.j) ^ hash<int>()(x.k);
}
};
</span>
The user defined function can be used as is in std::unordered_map, by passing it as a template parameter
<span style="font-size:14px;"> std::unordered_map<X,int,hash_X> my_map;
</span>
Or can be set as the default hash function by specializing the std::hash function<span style="font-size:14px;">namespace std {
template <>
class hash<X>{
public :
size_t operator()(const X &x ) const{
return hash<int>()(x.i) ^ hash<int>()(x.j) ^ hash<int>()(x.k);
}
};
}
//...
std::unordered_map<X,int> my_map;
</span>