C++ STL’s unordered_multiset And Its Applications
In this tutorial, we shall learn about C++ STL’s unordered_multiset and its applications. For understanding this you must know unordered_set which you can read it here unordered_set. But there is a problem in unordered_set, it is not possible to store duplicate entries. For example, if we enter the same value say k twice in an unordered_set then it would simply get ignored.
So the unordered_multiset comes as a savior in this problem. It can store duplicate values. It is done using incrementing a count variable internally which is associated with each value. But it comes at cost of space i.e. the if we add distinct elements to unordered_set and unordered_multiset then the latter will consume more space than the former due to the extra count variable associated with it.
unordered_multiset Functions
It has the following functions :
- begin()–Returns an iterator pointing to the first element in the container or pointing to the first element in one of its bucket
- end()–Returns an iterator pointing to the position immediately after the last element in the container or to the position immediately after the last element in one of its bucket
- insert()–Inserts new elements in the unordered_multiset and increases the container size
- equal_range()– Returns the range in which all the elements are equal to a given value
There are many more functions associated with unordered_multiset like erase(), max_size(), reserve() etc. Now let’s see an example code:
#include <bits/stdc++.h>
using namespace std;
typedef unordered_multiset<int>::iterator umit; // macro for unordered_multiset<int>::iterator
void PrintUtility(unordered_multiset<int>);
// Function to print unordered_multiset
int main()
{
unordered_multiset<int> umsl1; // empty initialization
unordered_multiset<int> umsl2({1, 2, 1, 5, 9, 4,
4, 8, 6}); // initializer list
umsl1 = {0, 5, 2, 7, 0, 4, 7, 5}; // Initialization by assignment
if (umsl1.empty()) // empty() function return true if the set is empty else false
cout << "The unordered_multiset first is empty\n\n";
else
cout << "The unordered_multiset first is not empty\n\n";
cout << "The size of unordered_multiset second is : "
<< umsl2.size() << endl; // size() function returns total number of elements
PrintUtility(umsl1);
umsl1.insert(8);
PrintUtility(umsl1);
int val = 3;
if (umsl1.find(val) != umsl1.end())
cout << "The unordered_multiset first contains "
<< val << endl;
else
cout << "The unordered_multiset first does not contains "
<< val << endl;
val = 5;
int cnt = umsl1.count(val); // count function returns total number of occurrence in set
cout << val << " appears " << cnt
<< " times in unordered_multiset first \n\n";
val = 9;
if (umsl1.count(val)) // if count return >0 value then element exist otherwise it doesn't
cout << "The unordered_multiset first contains "
<< val << endl;
else
cout << "The unordered_multiset first does not contains "
<< val << endl;
val = 1;
pair<umit, umit> erange_it = umsl2.equal_range(val);
if (erange_it.first != erange_it.second)
cout << val << " appeared atleast once in "
"unoredered_multiset \n\n";
PrintUtility(umsl2);
// erase function deletes all instances of val
umsl2.erase(val);
PrintUtility(umsl2);
// clear function deletes all entries from set
umsl1.clear();
umsl2.clear();
if (umsl1.empty())
cout << "The unordered_multiset first is empty\n\n";
else
cout << "The unordered_multiset first is not empty\n\n";
}
void PrintUtility(unordered_multiset<int> umls)
{
umit it = umls.begin(); // begin() returns iterator to first element of set
for (; it != umls.end(); it++)
cout << *it << " ";
cout << endl;
}The output will be:
The unordered_multiset first is not empty The size of unordered_multiset second is : 9 4 7 7 2 5 5 0 0 8 4 7 7 2 5 5 0 0 The unordered_multiset first does not contains 3 5 appears 2 times in unordered_multiset first The unordered_multiset first does not contains 9 1 appeared atleast once in unoredered_multiset 6 8 4 4 9 5 2 1 1 6 8 4 4 9 5 2 The unordered_multiset first is empty
You may also like to learn:
Leave a Reply