It's easy to use an unordered_set, or unordered_map with a basic key type, like int, float, string.
You simply set it up like
std::unordered_set<string> simple_hash_table;
But how does one create hash functors and compare functors for a more complex key?
Many times the key is composite, and a decent hash functor needs to be provided. For a struct like
you should write the hash and equality functors:
A good implementation of hash_combine() can be found in boost.
You simply set it up like
std::unordered_set<string> simple_hash_table;
But how does one create hash functors and compare functors for a more complex key?
Many times the key is composite, and a decent hash functor needs to be provided. For a struct like
struct XXX { int a; float b; string c; };
you should write the hash and equality functors:
struct XXX_Hash { size_t operator() (const XXX& p) const { size_t seed = 0; hash_combine( seed, p.a ); hash_combine( seed, p.b ); hash_combine( seed, p.c ); return seed; } }; struct XXX_Equals { bool operator() (const XXX& left, const XXX& right) const { return left.a == right.a && left.b == right.b && left.c == right.c; } }; std::unordered_set <XXX, XXX_Hash, XXX_Equals> complex_hash_table;
A good implementation of hash_combine() can be found in boost.
Many thanks!
ReplyDelete