How to Find with Hash Map
c++11
containers
intermediate
There’s two methods to find an element in a std::unordered_map: the find() method and the square bracket operator([]).
The find() method returns an iterator to a key-value pair, meaning an iterator to std::pair<Key, Value>.
Because it’s an iterator to a pair, you can access the key with it->first and the value with it->second.
If nothing was found, the end() iterator is returned from the unordered_map.
#include <unordered_map> #include <string> #include <iostream> int main() { std::unordered_map<int, std::string> statusCodes{ {200, "Success"}, {404, "This is not the page you're looking for"}, }; auto it = statusCodes.find(200); if (it != statusCodes.end()) { std::cout << it->first << ": " << it->second << "\n"; } else { std::cout << "No such status code.\n"; } it = statusCodes.find(1000); if (it != statusCodes.end()) { std::cout << it->first << ": " << it->second << "\n"; } else { std::cout << "No such status code.\n"; } }
200: Success No such status code.
The square bracket operator([]) returns a non-const reference to a key’s value, meaning a Value&.
Because this operator must return a reference it cannot represent the “not found” case that find() can with end().
This means if the square bracket operator([]) fails to find the element it default constructs a new element and returns a reference to that!
This can sometimes be useful but be careful as it’s usually unintended.
Here’s an example:
#include <unordered_map> #include <string> #include <iostream> int main() { std::unordered_map<int, std::string> statusCodes{ {200, "Success"}, {404, "This is not the page you're looking for"}, }; // This creates a new status code 503 with an empty description! std::string description = statusCodes[503]; std::cout << description << "\n"; // This constructs a new key-value! statusCodes[201] = "Oops, we meant 200!"; std::cout << statusCodes[201] << "\n"; // The map now has 4 elements in it! std::cout << statusCodes.size() << "\n"; }
Oops, we meant 200! 4