Search code examples
c++language-lawyermultimap

Does `std::multimap` guarantee actual value of each key in equal range?


C++ standard for "26.4.5.1 Class template multimap overview" p1 says:

A multimap is an associative container that supports equivalent keys (possibly containing multiple copies of the same key value) and provides for fast retrieval of values of another type T based on the keys.

emphasis is mine. So does it mean that std::multimap may not keep a copy of original key object when inserted into equal range and replace it with equal one?

PS To make clear this question is inspired by this Does Each Element of a multimap Contain Both the Key and Value? and I want to know if multimap allowed to do that ie can I rely on its ability to maintain my key (which could be equal but not the same).


Solution

  • No. The standard describes how an element is inserted in this table. For example, the effect of a_­eq.​emplace(​args) is described as follows (emphasis mine).

    Effects: Inserts a value_­type object t constructed with std​::​forward<​Args​>(​args)... and returns the iterator pointing to the newly inserted element. If a range containing elements equivalent to t exists in a_­eq, t is inserted at the end of that range.

    Note the value_­type of std::multimap<Key, T> is std::pair<const Key, T>, so a same (not only equivalent) key must be constructed.