According to this, it is possible to define an equality function in a TR1 unordered_map like this:
#include <tr1/unordered_map>
using namespace std;
using namespace std::tr1;
struct foo{
...
bool operator==(const foo& b) const{
return ..;
}
};
unordered_map<foo,int> map;
Is it possible to define the hash function the same way?
If you want to change the default hashing (or, more often, provide hashing for a type that isn't currently supported), you provide a specialization of
std::tr1::hash<T>
for your key-type:Note that specializing an existing template for a user-defined type is one of the rare cases where you specifically are allowed to write code in
namespace std
.The signature of the unordered_map class is this:
Your example works because the default Pred, std::equal_to<>, by default checks for equality using operator==. The compiler finds your foo::operator== member function and uses that.
std::hash doesn't have any specialisation which will call a member function on your class, so you can't just add a member to foo with a custom hash. You will need to specialise std::hash instead. If you want that to call a member function on foo, go ahead. You'll end up with something like this: