Now that std
has a real hash map in unordered_map
, why (or when) would I still want to use the good old map
over unordered_map
on systems where it actually exists? Are there any obvious situations that I cannot immediately see?
views:
162answers:
3I think it's obvious that you'd use the std::map
you need to iterate across items in the map in sorted order.
You might also use it when you'd prefer to write a comparison operator (which is intuitive) instead of a hash function (which is generally very unintuitive).
As already mentioned, map
allows to iterate over the elements in a sorted way, but unordered_map
does not. This is very important in many situations, for example displaying a collection (e.g. address book). This also manifests in other indirect ways like: (1) Start iterating from the iterator returned by find()
, or (2) existence of member functions like lower_bound()
.
Also, I think there is some difference in the worst case search complexity.
For
map
, it is O( lg N )For
unordered_map
, it is O( N ) [This may happen when the hash function is not good leading to too many hash collisions.]
The same is applicable for worst case deletion complexity.
In addition to the answers above you should also note that just because unordered_map
is constant speed (O(1)
) doesn't mean that it's faster than map
(of order log(N)
). The constant may be bigger than log(N)
especially since N
is limited by 232 (or 264).
So in addition to the other answers (map
maintains order and hash functions may be difficult) it may be that map
is more performant).
For example in a program I ran for a blog post I saw that for VS10 std::unordered_map
was slower than std::map
(although boost::unordered_map
was faster than both).
Note 3rd through 5th bars.