Re: hash_map insertion question
Greetings,
Is it possible (or easily make it possible) to insert into a hash_map
if I've already calculated a hash value for my key? Because of the
way my application works, prior to calling the hash_map insert, I've
already ran my key through a hash function for something else. I
would like to save some cycles by using it for my hash_map insert. I
realize I can send in a hash function with the creation of my hash_map
but tracking the callback to the insert seems like more trouble then
it's worth. I am using Visual Studio's 2005 STL.
TIA
hash_map isn't a part of the STL. I only know the gnu implementation
which differs from the VS implementation. Nevertheless they both follow
the design that you may pass a functor class responsible for calculating
the hash value as a std::size_t. At least the gnu implementation
does not only call the functor during <key,value> insertion but it
also gets called during iteration over the container and value erasure.
So the hassle of trying to poke inside of the hash_map for
insertion does not really solve your problem.
If your hash function is very time-consuming it might be worth to store
the hash value within the key itself. So you might do something like.
<snip>
myKey k;
k.setHash(my_very_time_consuming_hash_function())
</snip>
The the functor simply becomes:
<snip>
std::size_t operator()(const myKey &k) const {
return k.getHash();
}
<snip>
That's a question of time vs. memory traitoff, but if your key
data is very complex this approach also helps you in speeding up
other things like operator==() for example:
<snip>
bool operator==(const myKey & k) const {
bool r=false;
if(getHash()!=k.getHash()) {
return r;
}
// Otherwise do what ever is needed to
// compare the key data
return r;
}
</snip>
HTH
O.
--
[ See http://www.gotw.ca/resources/clcm.htm for info about ]
[ comp.lang.c++.moderated. First time posters: Do this! ]