set vs unordered_set in C++ STL

Pre-requisite : set in C++, unordered_set in C++

Differences :

                |     set             | unordered_set
---------------------------------------------------------
Ordering        | increasing  order   | no ordering
                | (by default)        |

Implementation  | Self balancing BST  | Hash Table
                | like Red-Black Tree |  

search time     | log(n)              | O(1) -> Average 
                |                     | O(n) -> Worst Case

Insertion time  | log(n) + Rebalance  | Same as search
                      
Deletion time   | log(n) + Rebalance  | Same as search

Use set when

Use unordered_set when

  • We need to keep a set of distinct elements and no ordering is required.
  • We need single element access i.e. no traversal.

Examples:

set:
Input  :  1, 8, 2, 5, 3, 9
Output :  1, 2, 3, 5, 8, 9

Unordered_set:
Input  : 1, 8, 2, 5, 3, 9
Output : 9 3 1 8 2 5 

If you want to look at implementation details of set and unordered_set in c++ STL, see Set Vs Map. Set allows to traverse elements in sorted order whereas Unordered_set doesn’t allow to traverse elements in sorted order.

[sourcecode language=”CPP”]
// Program to print elements of set
#include <bits/stdc++.h>
using namespace std;

int main()
{
set<int> s;
s.insert(5);
s.insert(1);
s.insert(6);
s.insert(3);
s.insert(7);
s.insert(2);

cout << "Elements of set in sorted order: \n";
for (auto it : s)
cout << it << " ";

return 0;
}
[/sourcecode]

Output:

Elements of set in sorted order: 
1 2 3 5 6 7

[sourcecode language=”CPP”]
// Program to print elements of set
#include <bits/stdc++.h>
using namespace std;

int main()
{
unordered_set<int> s;
s.insert(5);
s.insert(1);
s.insert(6);
s.insert(3);
s.insert(7);
s.insert(2);

cout << "Elements of unordered_set: \n";
for (auto it : s)
cout << it << " ";

return 0;
}
[/sourcecode]

Output:

Elements of unordered_set: 
2 7 5 1 6 3

Predecessor/Successor in Set:
Set can be modified to find predecessor or successor whereas Unordered_set doesn’t allow to find predecessor/Successor.

[sourcecode language=”CPP”]
// Program to print inorder predecessor and inorder successor
#include <bits/stdc++.h>
using namespace std;

set<int> s;

void inorderPredecessor(int key)
{
if (s.find(key) == s.end()) {
cout << "Key doesn’t exist\n";
return;
}

set<int>::iterator it;
it = s.find(key); // get iterator of key

// If iterator is at first position
// Then, it doesn’t have predecessor
if (it == s.begin()) {
cout << "No predecessor\n";
return;
}

–it; // get previous element
cout << "predecessor of " << key << " is=";
cout << *(it) << "\n";
}

void inorderSuccessor(int key)
{
if (s.find(key) == s.end()) {
cout << "Key doesn’t exist\n";
return;
}

set<int>::iterator it;
it = s.find(key); // get iterator of key
++it; // get next element

// Iterator points to NULL (Element does
// not exist)
if (it == s.end())
{
cout << "No successor\n";
return;
}
cout << "successor of " << key << " is=";
cout << *(it) << "\n";
}

int main()
{
s.insert(1);
s.insert(5);
s.insert(2);
s.insert(9);
s.insert(8);

inorderPredecessor(5);
inorderPredecessor(1);
inorderPredecessor(8);
inorderSuccessor(5);
inorderSuccessor(2);
inorderSuccessor(9);

return 0;
}
[/sourcecode]

Output:

predecessor of 5 is=2
No predecessor
predecessor of 8 is=5
successor of 5 is=8
successor of 2 is=5
No successor


My Personal Notes arrow_drop_up

Check out this Author's contributed articles.

If you like GeeksforGeeks and would like to contribute, you can also write an article using contribute.geeksforgeeks.org or mail your article to contribute@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.

Please Improve this article if you find anything incorrect by clicking on the "Improve Article" button below.