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 : " <
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.
C++
// 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; } |
Java
// JAVA program to find all values for a // given key. import java.util.*; class GFG { static class pair { int first, second; public pair( int first, int second) { this .first = first; this .second = second; } } public static void main(String[] args) { HashSet <pair> map = new LinkedHashSet<>(); // add the values in multimap map.add( new pair( 1 , 10 )); map.add( new pair( 2 , 20 )); map.add( new pair( 2 , 30 )); map.add( new pair( 2 , 40 )); map.add( new pair( 3 , 50 )); map.add( new pair( 4 , 60 )); map.add( new pair( 4 , 70 )); int key = 2 ; for (pair itr : map) if (itr.first == key) System.out.println(itr.first+ " " + itr.second); } } // This code is contributed by 29AjayKumar |
C#
// C# program to find all values for a // given key. using System; using System.Collections.Generic; class GFG { class pair { public int first, second; public pair( int first, int second) { this .first = first; this .second = second; } } // Driver code public static void Main(String[] args) { HashSet<pair> map = new HashSet<pair>(); //.Add the values in multimap map.Add( new pair(1, 10)); map.Add( new pair(2, 20)); map.Add( new pair(2, 30)); map.Add( new pair(2, 40)); map.Add( new pair(3, 50)); map.Add( new pair(4, 60)); map.Add( new pair(4, 70)); int key = 2; foreach (pair itr in map) if (itr.first == key) Console.WriteLine(itr.first+ " " + itr.second); } } // This code is contributed by Rajput-Ji |
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
#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; } |
Output:
2 20 2 30 2 40
Rated as one of the most sought after skills in the industry, own the basics of coding with our C++ STL Course and master the very concepts by intense problem-solving.