What happens if I read a map's value where the key does not exist?

Solution 1:

The map::operator[] searches the data structure for a value corresponding to the given key, and returns a reference to it.

If it can't find one it transparently creates a default constructed element for it. (If you do not want this behaviour you can use the map::at function instead.)

You can get a full list of methods of std::map here:

http://en.cppreference.com/w/cpp/container/map

Here is the documentation of map::operator[] from the current C++ standard...

23.4.4.3 Map Element Access

T& operator[](const key_type& x);

  1. Effects: If there is no key equivalent to x in the map, inserts value_type(x, T()) into the map.

  2. Requires: key_type shall be CopyConstructible and mapped_type shall be DefaultConstructible.

  3. Returns: A reference to the mapped_type corresponding to x in *this.

  4. Complexity: logarithmic.

T& operator[](key_type&& x);

  1. Effects: If there is no key equivalent to x in the map, inserts value_type(std::move(x), T()) into the map.

  2. Requires: mapped_type shall be DefaultConstructible.

  3. Returns: A reference to the mapped_type corresponding to x in *this.

  4. Complexity: logarithmic.

Solution 2:

If you try to access a key value using index operator [], then 2 things can happen :

  1. The map contains this key. So it will return the corresponding key value.
  2. The map doesn't contain the key. In this case, it will automatically add a key to the map with null value.

"pootoo" key does't exist in your map. So it will automatically add this key with value = ""(empty string). And your program will print empty string.

Here map size will increase by 1.

To search a key you can use map_name.find(), which will return map_name.end() if the key doesn't exist. And no extra key will be added.

You can use [] operator when you want to set value for a key.

Solution 3:

It's not undefined behavior. If operator [] doesn't find a value for the provided key, it inserts one at that position.

Solution 4:

For operator[], if you try to access a value for a key that doesn't exist, a new value object that has been default constructed will be put into the map and it's reference returned.