Multimap vs Map in C++ STL with Examples
Map stores unique key-value pairs in a sorted manner. Each key is uniquely associated with a value that may or may not be unique. A key can be inserted or deleted from a map but cannot be modified. Values assigned to keys can be changed. It is a great way for quickly accessing value using the key and it is done in O(1) time.
C++
#include <iostream> #include <iterator> #include <map> using namespace std; int main() { // empty map container map< int , int > gquiz1; // insert elements in random order gquiz1.insert(pair< int , int >(1, 40)); gquiz1.insert(pair< int , int >(2, 30)); gquiz1.insert(pair< int , int >(3, 60)); gquiz1.insert(pair< int , int >(4, 20)); gquiz1.insert(pair< int , int >(5, 50)); gquiz1.insert(pair< int , int >(6, 50)); gquiz1.insert(pair< int , int >(7, 10)); // printing map gquiz1 map< int , int >::iterator itr; cout << "\nThe map gquiz1 is : \n" ; cout << "\tKEY\tELEMENT\n" ; for (itr = gquiz1.begin(); itr != gquiz1.end(); ++itr) { cout << '\t' << itr->first << '\t' << itr->second << '\n' ; } cout << endl; // assigning the elements from gquiz1 to gquiz2 map< int , int > gquiz2(gquiz1.begin(), gquiz1.end()); // print all elements of the map gquiz2 cout << "\nThe map gquiz2 after" << " assign from gquiz1 is : \n" ; cout << "\tKEY\tELEMENT\n" ; for (itr = gquiz2.begin(); itr != gquiz2.end(); ++itr) { cout << '\t' << itr->first << '\t' << itr->second << '\n' ; } cout << endl; // remove all elements up to // element with key=3 in gquiz2 cout << "\ngquiz2 after removal of" " elements less than key=3 : \n" ; cout << "\tKEY\tELEMENT\n" ; gquiz2.erase(gquiz2.begin(), gquiz2.find(3)); for (itr = gquiz2.begin(); itr != gquiz2.end(); ++itr) { cout << '\t' << itr->first << '\t' << itr->second << '\n' ; } // remove all elements with key = 4 int num; num = gquiz2.erase(4); cout << "\ngquiz2.erase(4) : " ; cout << num << " removed \n" ; cout << "\tKEY\tELEMENT\n" ; for (itr = gquiz2.begin(); itr != gquiz2.end(); ++itr) { cout << '\t' << itr->first << '\t' << itr->second << '\n' ; } cout << endl; // lower bound and upper bound // for map gquiz1 key = 5 cout << "gquiz1.lower_bound(5) : " << "\tKEY = " ; cout << gquiz1.lower_bound(5)->first << '\t' ; cout << "\tELEMENT = " << gquiz1.lower_bound(5)->second << endl; cout << "gquiz1.upper_bound(5) : " << "\tKEY = " ; cout << gquiz1.upper_bound(5)->first << '\t' ; cout << "\tELEMENT = " << gquiz1.upper_bound(5)->second << endl; return 0; } |
The map gquiz1 is : KEY ELEMENT 1 40 2 30 3 60 4 20 5 50 6 50 7 10 The map gquiz2 after assign from gquiz1 is : KEY ELEMENT 1 40 2 30 3 60 4 20 5 50 6 50 7 10 gquiz2 after removal of elements less than key=3 : KEY ELEMENT 3 60 4 20 5 50 6 50 7 10 gquiz2.erase(4) : 1 removed KEY ELEMENT 3 60 5 50 6 50 7 10 gquiz1.lower_bound(5) : KEY = 5 ELEMENT = 50 gquiz1.upper_bound(5) : KEY = 6 ELEMENT = 50
Multimap is similar to map with an addition that multiple elements can have same keys. Also, it is NOT required that the key value and mapped value pair has to be unique in this case. One important thing to note about multimap is that multimap keeps all the keys in sorted order always. These properties of multimap makes it very much useful in competitive programming.
C++
#include <iostream> #include <iterator> #include <map> using namespace std; int main() { // empty multimap container multimap< int , int > gquiz1; // insert elements in random order gquiz1.insert(pair< int , int >(1, 40)); gquiz1.insert(pair< int , int >(2, 30)); gquiz1.insert(pair< int , int >(3, 60)); gquiz1.insert(pair< int , int >(6, 50)); gquiz1.insert(pair< int , int >(6, 10)); // printing multimap gquiz1 multimap< int , int >::iterator itr; cout << "\nThe multimap gquiz1 is : \n" ; cout << "\tKEY\tELEMENT\n" ; for (itr = gquiz1.begin(); itr != gquiz1.end(); ++itr) { cout << '\t' << itr->first << '\t' << itr->second << '\n' ; } cout << endl; // adding elements randomly, // to check the sorted keys property gquiz1.insert(pair< int , int >(4, 50)); gquiz1.insert(pair< int , int >(5, 10)); // printing multimap gquiz1 again cout << "\nThe multimap gquiz1 after" << " adding extra elements is : \n" ; cout << "\tKEY\tELEMENT\n" ; for (itr = gquiz1.begin(); itr != gquiz1.end(); ++itr) { cout << '\t' << itr->first << '\t' << itr->second << '\n' ; } cout << endl; // assigning the elements from gquiz1 to gquiz2 multimap< int , int > gquiz2(gquiz1.begin(), gquiz1.end()); // print all elements of the multimap gquiz2 cout << "\nThe multimap gquiz2 after" << " assign from gquiz1 is : \n" ; cout << "\tKEY\tELEMENT\n" ; for (itr = gquiz2.begin(); itr != gquiz2.end(); ++itr) { cout << '\t' << itr->first << '\t' << itr->second << '\n' ; } cout << endl; // remove all elements up to // key with value 3 in gquiz2 cout << "\ngquiz2 after removal of" << " elements less than key=3 : \n" ; cout << "\tKEY\tELEMENT\n" ; gquiz2.erase(gquiz2.begin(), gquiz2.find(3)); for (itr = gquiz2.begin(); itr != gquiz2.end(); ++itr) { cout << '\t' << itr->first << '\t' << itr->second << '\n' ; } // remove all elements with key = 4 int num; num = gquiz2.erase(4); cout << "\ngquiz2.erase(4) : " ; cout << num << " removed \n" ; cout << "\tKEY\tELEMENT\n" ; for (itr = gquiz2.begin(); itr != gquiz2.end(); ++itr) { cout << '\t' << itr->first << '\t' << itr->second << '\n' ; } cout << endl; // lower bound and upper bound // for multimap gquiz1 key = 5 cout << "gquiz1.lower_bound(5) : " << "\tKEY = " ; cout << gquiz1.lower_bound(5)->first << '\t' ; cout << "\tELEMENT = " << gquiz1.lower_bound(5)->second << endl; cout << "gquiz1.upper_bound(5) : " << "\tKEY = " ; cout << gquiz1.upper_bound(5)->first << '\t' ; cout << "\tELEMENT = " << gquiz1.upper_bound(5)->second << endl; return 0; } |
The multimap gquiz1 is : KEY ELEMENT 1 40 2 30 3 60 6 50 6 10 The multimap gquiz1 after adding extra elements is : KEY ELEMENT 1 40 2 30 3 60 4 50 5 10 6 50 6 10 The multimap gquiz2 after assign from gquiz1 is : KEY ELEMENT 1 40 2 30 3 60 4 50 5 10 6 50 6 10 gquiz2 after removal of elements less than key=3 : KEY ELEMENT 3 60 4 50 5 10 6 50 6 10 gquiz2.erase(4) : 1 removed KEY ELEMENT 3 60 5 10 6 50 6 10 gquiz1.lower_bound(5) : KEY = 5 ELEMENT = 10 gquiz1.upper_bound(5) : KEY = 6 ELEMENT = 50
Time and space complexity:
- Inserting elements: O(log n) time complexity for each insertion operation, where n is the number of elements in the multimap. O(1) space complexity for each insertion operation.
- Printing the multimap: O(n) time complexity, where n is the number of elements in the multimap. O(1) space complexity.
- Adding elements: O(log n) time complexity for each insertion operation, where n is the number of elements in the multimap. O(1) space complexity for each insertion operation.
- Assigning elements from one multimap to another: O(n) time complexity, where n is the number of elements being assigned. O(n) space complexity, where n is the number of elements being assigned.
- Removing elements up to a certain key: O(log n) time complexity, where n is the number of elements in the multimap. O(1) space complexity.
- Removing elements with a certain key: O(log n) time complexity, where n is the number of elements in the multimap. O(1) space complexity.
- Finding the lower bound and upper bound of a key: O(log n) time complexity, where n is the number of elements in the multimap. O(1) space complexity.
- Overall, the time complexity of the program is dominated by the logarithmic time complexity of the insertion and removal operations, as well as the lower and upper bound operations. The space complexity is linear in the number of elements being assigned from one multimap to another.
Difference between Map and Multimap in C++ STL
S No. | Map | Multimap |
1 | It stores unique key-value pair where each key is unique. | It can store duplicate key-value pair where keys may not be unique. |
2 | Using count() function on a map can only return two values which is either 0 or 1. | Using count() function on a multimap can return any non-negative integer. |
3 | Accessing Value of any key is easy and directly accessible. | Accessing value of any key is not easy and is not directly accessible. |
4 | Deleting in a map using key will delete only one key-value pair. | Deleting in a multimap using key will delete all the key-value pair having same key. |
5 | Map can be used when a simple look up table having unique key-value pairs is required for quickly accessing to the value using the key. | Multimap can be used when grouping of values together using the keys are required. |
Please Login to comment...