How to traverse through all values for a given key in multimap?

Given a multimap and a key of the multimap, our task is to simply display the (key – value) pairs of the given key. In multimap we can have multiple (key – value) pair for the same key. Suppose our multimap contains

key     value
1         10
2         20
2         30
2         40
3         50
4         60
4         70

key : 2
key     value
2         20
2         30
2         40

Like in unordered_map in C++ STL we cant fetch values like

int key = 2;
multimap  map;

// insert values in map
cout << "Key : " << key;
cout << "Value : " < second;

Output :

Key : 2
Value : 20

Because the above method will only return the first occurrence of the key present, This method fails if there are multiple (key – value) pairs for the same key.

There are two ways by which we can achieve the expected results :
Method 1 (Simple Traversal) Traverse through whole map and whenever the key is equal to given key we display the key-value pair.

filter_none

edit
close

play_arrow

link
brightness_4
code

// CPP program to find all values for a 
// given key.
#include <bits/stdc++.h>
using namespace std;
  
int main()
{
    multimap <int, int> map;
  
    // insert the values in multimap
    map.insert(make_pair(1, 10));
    map.insert(make_pair(2, 20));
    map.insert(make_pair(2, 30));
    map.insert(make_pair(2, 40));
    map.insert(make_pair(3, 50));
    map.insert(make_pair(4, 60));
    map.insert(make_pair(4, 70));
      
    int key = 2;    
    for (auto itr = map.begin(); itr != map.end(); itr++)    
        if (itr -> first == key)        
            cout << itr -> first << "  " 
                 << itr -> second << endl;
  
    return 0;

chevron_right


Output:

2  20
2  30
2  40

Method 2(Using Binary Search)Find the lower_bound and upper_bound for the given key and traverse between them.
lower_bound(key) : returns the iterator pointing to the first element which is greater than or
equal to key.
upper_bound(key) : returns the iterator pointing to the first element which is greater than key.

key     value
1         10
2         20 <-- lower_bound(20)
2         30
2         40
3         50 <-- upper_bound(20)
4         60
4         70
filter_none

edit
close

play_arrow

link
brightness_4
code

#include <bits/stdc++.h>
using namespace std;
  
int main()
{
    multimap <int, int> map;
  
    // insert the values in multimap
    map.insert(make_pair(1, 10));
    map.insert(make_pair(2, 20));
    map.insert(make_pair(2, 30));
    map.insert(make_pair(2, 40));
    map.insert(make_pair(3, 50));
    map.insert(make_pair(4, 60));
    map.insert(make_pair(4, 70));
      
    int key = 2;    
    auto itr1 = map.lower_bound(key);
    auto itr2 = map.upper_bound(key);
      
    while (itr1 != itr2)    
    {
        if (itr1 -> first == key)
           cout << itr1 -> first << "  "  
                << itr1 -> second << endl;        
        itr1++;
    }    
    return 0;
}

chevron_right


Output:

2  20
2  30
2  40


My Personal Notes arrow_drop_up

Interested in problems and solving them

If you like GeeksforGeeks and would like to contribute, you can also write an article using contribute.geeksforgeeks.org or mail your article to contribute@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.

Please Improve this article if you find anything incorrect by clicking on the "Improve Article" button below.




Article Tags :
Practice Tags :


Be the First to upvote.


Please write to us at contribute@geeksforgeeks.org to report any issue with the above content.