How to remove a specific pair from a C++ multimap?

Viewed 20221
#include <map>

...

multimap<char,int> mymap;

mymap.insert(pair<char,int>('a',10));
mymap.insert(pair<char,int>('b',15));
mymap.insert(pair<char,int>('b',20));
mymap.insert(pair<char,int>('c',25));

Say I now want to remove one of the pairs I have just added to the map.

I have examples to remove an entire key entry, which for key 'b' would remove both 'b',15 and 'b',20.

But what is the code to remove just, say, the pair 'b',20?

2 Answers

In case you need to continue iterating after the first match you need to first retrieve an iterator to the next element since the erased iterator gets invalidated.

One way to achieve this, starting from C++11, is to use the return value of the erase function which is an iterator to the element that follows the last element removed (or multimap::end, if the last element was removed). Beware the key based version returns the number of elements erased, not an iterator.

Building on top of the valuable Charles Salvia answer, showing how to erase (b,15 ) pair, you get

multimap<char,int> mymap;

mymap.insert(pair<char,int>('a',10));
mymap.insert(pair<char,int>('b',15));
mymap.insert(pair<char,int>('b',20));
mymap.insert(pair<char,int>('c',25));

typedef multimap<char, int>::iterator iterator;
std::pair<iterator, iterator> iterpair = mymap.equal_range('b');

// Erase (b,15) pair
//
iterator it = iterpair.first;
for (; it != iterpair.second; ) {
    if (it->second == 15) { 
        it=mymap.erase(it);
    }
    else
        ++it;
}
Related