Reputation: 327
I'd like use boost::unordered_map<key,value>
, where key
is a std::set<int>
. Since a set of integers is no built-in type, I assumed I had to supply my own hash function (or, rather, I was thinking of using boost's hash_range).
However, now I tried initializing a hash map like this, neither supplying a hash function nor an equality predicate -- and gcc didn't complain. What is happening here? Is boost clever enough to hash STL containers all on its own? Is this going to be slower than if I used a custom hash function? What about using boost::hash_range
?
Thanks in advance.
Upvotes: 4
Views: 3795
Reputation: 81349
The default boost::hash< Key >
function is being chosen. According to its documentation
As it is compliant with TR1, it will work with:
integers floats pointers strings
It also implements the extension proposed by Peter Dimov in issue 6.18 of the Library Extension Technical Report Issues List (page 63), this adds support for:
arrays std::pair the standard containers. extending boost::hash for custom types.
http://www.boost.org/doc/html/hash.html
So yes, boost is clever enough to hash STL containers. Unless you know something specific of your particular use case of set
, I doubt there is any point in providing your own hash function.
Upvotes: 3
Reputation: 372664
According to the Boost documentation:
the default hash function is Boost.Hash
And, according to the documentation for Boost.Hash, default hash functions are provided for the standard containers. Consequently, there is already a hash function written for std::set
. The Boost hash containers aren't smart enough to know how to hash sets automatically, but they are smart enough to use the implementation that's already provided.
Hope this helps!
Upvotes: 3