How to create an unordered_set of user defined class or struct in C++?
Last Updated :
22 Nov, 2021
The unordered_set internally implements a hash table to store elements. By default we can store only predefined type as int, string, float etc.
If we want to store the element of user defined type as structure then compiler will show an error because before storing elements into unordered_set compiler performs some checking. And while comparing two user defined type compiler can not compare them hence it generate an error.
So, in order to store a structure in a unordered_set, some comparison function need to be designed. Since unordered_set also store implements hash table to store elements we should also have to implement hash function to perform hashing related work.
Below method explains its implementation.
Implementation: We create a structure type and define a comparison function inside that structure that will used to compare two structure type objects. Since unordered_set internally implements hash function so we should have also implement the hash function for user defined type objects.
Syntax To store user defined type elements unordered_set should follow following syntax
unordered_set(elementType, MyHashType) us;
// element type is user defined type and MyHashType is class implementing hash function
Below code explains it.
CPP
#include <bits/stdc++.h>
using namespace std;
struct Test {
int id;
bool operator==( const Test& t) const
{
return ( this ->id == t.id);
}
};
class MyHashFunction {
public :
size_t operator()( const Test& t) const
{
return t.id;
}
};
int main()
{
Test t1 = { 110 }, t2 = { 102 },
t3 = { 101 }, t4 = { 115 };
unordered_set<Test, MyHashFunction> us;
us.insert(t1);
us.insert(t2);
us.insert(t3);
us.insert(t4);
for ( auto e : us) {
cout << e.id << " " ;
}
return 0;
}
|
Below is another example where we use predefined hash functions to make overall hash function of our defined class.
CPP
#include <bits/stdc++.h>
using namespace std;
struct Person {
string first, last;
Person(string f, string l)
{
first = f;
last = l;
}
bool operator==( const Person& p) const
{
return first == p.first && last == p.last;
}
};
class MyHashFunction {
public :
size_t operator()( const Person& p) const
{
return (hash<string>()(p.first)) ^ (hash<string>()(p.last));
}
};
int main()
{
unordered_set<Person, MyHashFunction> us;
Person p1( "kartik" , "kapoor" );
Person p2( "Ram" , "Singh" );
Person p3( "Laxman" , "Prasad" );
us.insert(p1);
us.insert(p2);
us.insert(p3);
for ( auto e : us) {
cout << "[" << e.first << ", "
<< e.last << "]\n" ;
}
return 0;
}
|
Output:
[Laxman, Prasad]
[kartik, kapoor]
[Ram, Singh]
Like Article
Suggest improvement
Share your thoughts in the comments
Please Login to comment...