unordered set of Vectors in C++ with Examples

19 Dec, 2021
What is an unordered set?
In C++, an unordered set is an unordered container that can hold a number of unique elements. Unlike a set, elements in an unordered set are not arranged in any particular order. Internally, an unordered set is implemented using a hash table where keys are hashed into indices of a hash table that is why the insertion is always randomized. All operations on the unordered_set take constant time O(1) on an average but it may go up to linear time O(n) in the worst case that also depends upon the internally used hash function.  
The unordered_set can contain key of any type – predefined or user-defined data structure but when we define key of type user defines the type, we need to specify our comparison function according to which keys will be compared. 
Functions associated with an unordered set:
insert(): Insert a new {element} in the unordered_set container.
begin(): Return an iterator pointing to the first element in the unordered_set container.
end(): Returns an iterator pointing to the past-the-end-element.
count(): Count occurrences of a particular element in an unordered_set container.
find(): Search for an element in the container.
clear(): Removes all of the elements from an unordered_set and empties it.
What is Vector?
In C++, a vector is similar to a dynamic array with the ability to resize itself. Elements of a vector are stored in contiguous memory locations and they can be accessed with the help of iterators also. 
Some of the functions associated with a vector are described below:
begin(): Returns an iterator pointing to the first element in the vector
end(): Returns an iterator pointing to the theoretical element that follows the last element in the vector
rbegin(): Returns a reverse iterator pointing to the last element in the vector (reverse beginning). It moves from last to the first element
rend(): Returns a reverse iterator pointing to the theoretical element preceding the first element in the vector (considered as reverse end)
cbegin(): Returns a constant iterator pointing to the first element in the vector.
cend(): Returns a constant iterator pointing to the theoretical element that follows the last element in the vector.
crbegin(): Returns a constant reverse iterator pointing to the last element in the vector (reverse beginning). It moves from last to the first element.
crend(): Returns a constant reverse iterator pointing to the theoretical element preceding the first element in the vector (considered as reverse end).
What is unordered set of vectors?
An unordered set vector is an unordered associative container that is used to hold unique vectors together. Two vectors are considered the same if the corresponding elements of the vectors are equal. Unlike a set of vectors, vectors are not arranged in any particular order in an unordered set of vectors. By default, C++ doesn’t provide us the facility to create an unordered set of vectors. We are required to pass a hash function using which one can easily create an unordered set of vectors.
Syntax:
unordered_set<vector<dataType>, hashFunction> myUnorderedSet;
Here,
dataType: A data type. It represents the type of value stored by each vector in the unordered set.
hashFunction:
       struct hashFunction       {         size_t operator()(const vector<int> &myVector) const          {             std::hash<int> hasher;             size_t answer = 0;             for (int i : myVector)             {                answer ^= hasher(i) + 0x9e3779b9 +                                   (answer << 6) + (answer >> 2);           }           return answer;       }   };
Note:One can customize the hash function according to the need but the above hash function is quite efficient to handle collisions.
Example 1: Below is the C++ program of an unordered set of vectors of integer type.
C++
// C++ program to demonstrate the // working of unordered set of vectors#include <bits/stdc++.h>using namespace std;  // Hash functionstruct hashFunction {  size_t operator()(const vector<int>                     &myVector) const   {    std::hash<int> hasher;    size_t answer = 0;          for (int i : myVector)     {      answer ^= hasher(i) + 0x9e3779b9 +                 (answer << 6) + (answer >> 2);    }    return answer;  }};  // Function to iterate over // vector elementsvoid printVector(vector<int> myVector){  cout << "[ ";  for(auto element : myVector)    cout << element << ' ';  cout << "]\n";}  // Function to iterate over unordered // set elementsvoid print(unordered_set<vector<int>,            hashFunction> &unorderedsetOfVectors){  for (auto it = unorderedsetOfVectors.begin();       it != unorderedsetOfVectors.end();       it++)   {    // Each element is a vector    printVector(*it);  }}  // Driver codeint main(){  // Declaring a unordered set of vectors  // Each vector is of integer type  // We are passing a hash function as   // an argument to the unordered set  unordered_set<vector<int>,   hashFunction> unorderedsetOfVectors;    // Initializing vectors  vector<int> myVector1 {3, 6, 9, 10};  vector<int> myVector2 {5, 10, 11, 7};  vector<int> myVector3 {3, 6, 9, 10};  vector<int> myVector4 {1, 9, 11, 22};  vector<int> myVector5 {50, 20, 30, 40};    // Inserting vectors into unorderedset  unorderedsetOfVectors.insert(myVector1);  unorderedsetOfVectors.insert(myVector2);  unorderedsetOfVectors.insert(myVector3);  unorderedsetOfVectors.insert(myVector4);  unorderedsetOfVectors.insert(myVector5);    // Calling print function  print(unorderedsetOfVectors);    return 0;}
Output:
[ 50 20 30 40 ][ 1 9 11 22 ][ 3 6 9 10 ][ 5 10 11 7 ]
Explanation:
Vector1 and vector3 are the same in the above example. As an unordered set contains only unique elements, hence it was printed only once inside the unordered set.  Also, note that the unordered set has not followed any particular order of elements.
Example 2: Below is the C++ program of an unordered set of vectors of boolean type.
C++
// C++ program to demonstrate the // working of unordered set // of vectors#include <bits/stdc++.h>using namespace std;  // Hash functionstruct hashFunction {  size_t operator()(const vector<bool>                     &myVector) const   {    std::hash<bool> hasher;    size_t answer = 0;    for (int i : myVector)     {      answer ^= hasher(i) + 0x9e3779b9 +                 (answer << 6) + (answer >> 2);    }    return answer;  }};  // Function to iterate over // vector elementsvoid printVector(vector<bool> myVector){  cout << "[ ";  for(auto element : myVector)    cout << element << ' ';  cout << "]\n";}  // Function to iterate over unordered // set elementsvoid print(unordered_set<vector<bool>,           hashFunction> &unorderedsetOfVectors){  for (auto it = unorderedsetOfVectors.begin();       it != unorderedsetOfVectors.end();       it++)  {    // Each element is a vector    printVector(*it);  }}  // Driver codeint main(){  // Declaring a unordered set of vectors  // Each vector is of bool type  // We are passing a hash function as   // an argument to the unordered set  unordered_set<vector<bool>,   hashFunction> unorderedsetOfVectors;    // Initializing vectors of bool type  vector<bool> myVector1   {true, true, true, true};  vector<bool> myVector2   {false, false, false, false};  vector<bool> myVector3   {true, true, true, false};  vector<bool> myVector4   {true, true, false, false};  vector<bool> myVector5   {true, true, false, true};  vector<bool> myVector6   {true, true, true, true};    // Inserting vectors into unordered set  unorderedsetOfVectors.insert(myVector1);  unorderedsetOfVectors.insert(myVector2);  unorderedsetOfVectors.insert(myVector3);  unorderedsetOfVectors.insert(myVector4);  unorderedsetOfVectors.insert(myVector5);  unorderedsetOfVectors.insert(myVector6);    // Calling print function  print(unorderedsetOfVectors);    return 0;}
Output:
[ 1 1 0 1 ][ 1 1 0 0 ][ 1 1 1 0 ][ 1 1 1 1 ][ 0 0 0 0 ]
Explanation:
Vector1 and vector6 are the same in the above example. As an unordered set contains only unique elements, hence it was printed only once inside the unordered set. Also, note that the unordered set has not followed any particular order of elements.
cpp-unordered_set
cpp-vector
STL
C++
STL
CPP
Writing code in comment?
Please use ide.geeksforgeeks.org,
generate link and share the link here.