Aside from operations that manage the hashing, the unordered containers provide the same operations (find, insert
, and so on) as the ordered containers. That means that the operations we’ve used on map
and set
apply to unordered_map
and unordered_set
as well. Similarly for the unordered versions of the containers that allow multiple keys.
As a result, we can usually use an unordered container in place of the corresponding ordered container, and vice versa. However, because the elements are not stored in order, the output of a program that uses an unordered container will (ordinarily) differ from the same program using an ordered container.
For example, we can rewrite our original word-counting program from § 11.1 (p. 421) to use an unordered_map
:
// count occurrences, but the words won't be in alphabetical order
unordered_map<string, size_t> word_count;
string word;
while (cin >> word)
++word_count[word]; // fetch and increment the counter for word
for (const auto &w : word_count) // for each element in the map
// print the results
cout << w.first << " occurs " << w.second
<< ((w.second > 1) ? " times" : " time") << endl;
The type of word_count
is the only difference between this program and our original. If we run this version on the same input as our original program,
containers. occurs 1 time
use occurs 1 time
can occurs 1 time
examples occurs 1 time
...
we’ll obtain the same count for each word in the input. However, the output is unlikely to be in alphabetical order.