Open In App

Set in C++ Standard Template Library (STL)

Last Updated : 23 Sep, 2023
Improve
Improve
Like Article
Like
Save
Share
Report

Sets are a type of associative container in which each element has to be unique because the value of the element identifies it. The values are stored in a specific sorted order i.e. either ascending or descending.

The std::set class is the part of C++ Standard Template Library (STL) and it is defined inside the <set> header file.

Syntax:

std::set <data_type> set_name;

Datatype: Set can take any data type depending on the values, e.g. int, char, float, etc.

Example:

set<int> val; // defining an empty set
set<int> val = {6, 10, 5, 1}; // defining a set with values

Program:

C++




// C++ Program to Demonstrate
// the basic working of STL
#include <iostream>
#include <set>
 
int main()
{
    std::set<char> a;
    a.insert('G');
    a.insert('F');
    a.insert('G');
    for (auto& str : a) {
        std::cout << str << ' ';
    }
    std::cout << '\n';
    return 0;
}


Output

F G 

Time complexity: O(N) // N is the size of the set.

Auxiliary Space: O(N)

The reason it printed only F and G is that set does not take multiple same values it only accepts a unique value. We can use Multiset if we want to store multiple same values.

Set Sorted in Descending Order

By default, the std::set is sorted in ascending order. However, we have the option to change the sorting order by using the following syntax.

std::set <data_type, greater<data_type>> set_name;

Example:

C++




// C++ program to demonstrate the creation of descending
// order set container
#include <iostream>
#include <set>
using namespace std;
 
int main()
{
 
    set<int, greater<int> > s1;
    s1.insert(10);
    s1.insert(5);
    s1.insert(12);
    s1.insert(4);
 
    for (auto i : s1) {
        cout << i << ' ';
    }
    return 0;
}


Output

12 10 5 4 

Time complexity: O(N) // N is the size of the set.

Auxiliary Space: O(N)

Note: We can use any comparator in place of greater<data_type> to give set a custom order sorting.

Properties

  1. Storing order – The set stores the elements in sorted order.
  2. Values Characteristics – All the elements in a set have unique values.
  3. Values Nature – The value of the element cannot be modified once it is added to the set, though it is possible to remove and then add the modified value of that element. Thus, the values are immutable.
  4. Search Technique – Sets follow the Binary search tree implementation.
  5. Arranging order – The values in a set are unindexed.

Note: To store the elements in an unsorted(random) order,  unordered_set() can be used.

Some Basic Functions Associated with Set

  • begin() – Returns an iterator to the first element in the set.
  • end() – Returns an iterator to the theoretical element that follows the last element in the set.
  • size() – Returns the number of elements in the set.
  • max_size() – Returns the maximum number of elements that the set can hold.
  • empty() – Returns whether the set is empty.

The time complexities for doing various operations on sets are:

  • Insertion of Elements – O(log N)
  • Deletion of Elements – O(log N)

CPP




// C++ program to demonstrate various functions of
// STL
#include <iostream>
#include <iterator>
#include <set>
using namespace std;
 
int main()
{
    // empty set container
    set<int, greater<int> > s1;
 
    // insert elements in random order
    s1.insert(40);
    s1.insert(30);
    s1.insert(60);
    s1.insert(20);
    s1.insert(50);
 
    // only one 50 will be added to the set
    s1.insert(50);
    s1.insert(10);
 
    // printing set s1
    set<int, greater<int> >::iterator itr;
    cout << "\nThe set s1 is : \n";
    for (itr = s1.begin(); itr != s1.end(); itr++) {
        cout << *itr << " ";
    }
    cout << endl;
 
    // assigning the elements from s1 to s2
    set<int> s2(s1.begin(), s1.end());
 
    // print all elements of the set s2
    cout << "\nThe set s2 after assign from s1 is : \n";
    for (itr = s2.begin(); itr != s2.end(); itr++) {
        cout << *itr << " ";
    }
    cout << endl;
 
    // remove all elements up to 30 in s2
    cout << "\ns2 after removal of elements less than 30 "
            ":\n";
    s2.erase(s2.begin(), s2.find(30));
    for (itr = s2.begin(); itr != s2.end(); itr++) {
        cout << *itr << " ";
    }
 
    // remove element with value 50 in s2
    int num;
    num = s2.erase(50);
    cout << "\ns2.erase(50) : ";
    cout << num << " removed\n";
    for (itr = s2.begin(); itr != s2.end(); itr++) {
        cout << *itr << " ";
    }
 
    cout << endl;
 
    // lower bound and upper bound for set s1
    cout << "s1.lower_bound(40) : "
         << *s1.lower_bound(40) << endl;
    cout << "s1.upper_bound(40) : "
         << *s1.upper_bound(40) << endl;
 
    // lower bound and upper bound for set s2
    cout << "s2.lower_bound(40) : "
         << *s2.lower_bound(40) << endl;
    cout << "s2.upper_bound(40) : "
         << *s2.upper_bound(40) << endl;
 
    return 0;
}


Output

The set s1 is : 
60 50 40 30 20 10 

The set s2 after assign from s1 is : 
10 20 30 40 50 60 

s2 after removal of elements less than 30 :
30 40 50 60 
s2.erase(50) : 1 removed
30 40 60 
s1.lower_bound(40) : 40
s1.upper_bound(40) : 30
s2.lower_bound(40) : 40
s2.upper_bound(40) : 60

Different Function of Set in C++ STL

Function Description
begin() Returns an iterator to the first element in the set.
end() Returns an iterator to the theoretical element that follows the last element in the set.
rbegin() Returns a reverse iterator pointing to the last element in the container.
rend() Returns a reverse iterator pointing to the theoretical element right before the first element in the set container.
crbegin() Returns a constant iterator pointing to the last element in the container.
crend() Returns a constant iterator pointing to the position just before the first element in the container.
cbegin() Returns a constant iterator pointing to the first element in the container.
cend() Returns a constant iterator pointing to the position past the last element in the container.
size() Returns the number of elements in the set.
max_size() Returns the maximum number of elements that the set can hold.
empty() Returns whether the set is empty.
insert(const g)  Adds a new element ‘g’ to the set.
iterator insert (iterator position, const g) Adds a new element ‘g’ at the position pointed by the iterator.
erase(iterator position)  Removes the element at the position pointed by the iterator.
erase(const g) Removes the value ‘g’ from the set.
clear()  Removes all the elements from the set.
key_comp() / value_comp() Returns the object that determines how the elements in the set are ordered (‘<‘ by default).
find(const g) Returns an iterator to the element ‘g’ in the set if found, else returns the iterator to the end.
count(const g) Returns 1 or 0 based on whether the element ‘g’ is present in the set or not.
lower_bound(const g) Returns an iterator to the first element that is equivalent to ‘g’ or definitely will not go before the element ‘g’ in the set.
upper_bound(const g) Returns an iterator to the first element that will go after the element ‘g’ in the set.
equal_range() The function returns an iterator of pairs. (key_comp). The pair refers to the range that includes all the elements in the container which have a key equivalent to k.
emplace() This function is used to insert a new element into the set container, only if the element to be inserted is unique and does not already exist in the set.
emplace_hint() Returns an iterator pointing to the position where the insertion is done. If the element passed in the parameter already exists, then it returns an iterator pointing to the position where the existing element is.
swap() This function is used to exchange the contents of two sets but the sets must be of the same type, although sizes may differ.
operator= The ‘=’ is an operator in C++ STL that copies (or moves) a set to another set and set::operator= is the corresponding operator function.
get_allocator() Returns the copy of the allocator object associated with the set.

Difference between Set and Unordered Set

Set

Unordered Set

Set stores elements in a sorted order Unordered Set stores elements in an unsorted order
Set stores/acquire unique elements only Unordered Set stores/acquire only unique values
Set uses Binary Search Trees for implementation Unordered Set uses Hash Tables for implementation
More than one element can be erased by giving the starting and ending iterator We can erase that element for which the iterator position is given
set<datatype> Set_Name; unordered_set<datatype> UnorderedSet_Name;

For more information, you can refer to the article – Sets vs Unordered Set.



Similar Reads

The C++ Standard Template Library (STL)
The Standard Template Library (STL) is a set of C++ template classes to provide common programming data structures and functions such as lists, stacks, arrays, etc. It is a library of container classes, algorithms, and iterators. It is a generalized library and so, its components are parameterized. Working knowledge of template classes is a prerequ
5 min read
Sort in C++ Standard Template Library (STL)
Sorting is one of the most basic functions applied to data. It means arranging the data in a particular fashion, which can be increasing or decreasing. There is a builtin function in C++ STL by the name of sort(). This function internally uses IntroSort. In more details it is implemented using hybrid of QuickSort, HeapSort and InsertionSort.By defa
6 min read
Priority Queue in C++ Standard Template Library (STL)
A C++ priority queue is a type of container adapter, specifically designed such that the first element of the queue is either the greatest or the smallest of all elements in the queue, and elements are in non-increasing or non-decreasing order (hence we can see that each element of the queue has a priority {fixed order}). In C++ STL, the top elemen
11 min read
Containers in C++ STL (Standard Template Library)
A container is a holder object that stores a collection of other objects (its elements). They are implemented as class templates, which allows great flexibility in the types supported as elements. The container manages the storage space for its elements and provides member functions to access them, either directly or through iterators (reference ob
2 min read
Binary Search in C++ Standard Template Library (STL)
Binary search is a widely used searching algorithm that requires the array to be sorted before search is applied. The main idea behind this algorithm is to keep dividing the array in half (divide and conquer) until the element is found, or all the elements are exhausted.It works by comparing the middle item of the array with our target, if it match
3 min read
Multimap in C++ Standard Template Library (STL)
Multimap is similar to a map with the addition that multiple elements can have the same keys. Also, it is NOT required that the key-value and mapped value pair have 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 make it very much useful i
6 min read
Map in C++ Standard Template Library (STL)
Maps are associative containers that store elements in a mapped fashion. Each element has a key value and a mapped value. No two mapped values can have the same key values. std::map is the class template for map containers and it is defined inside the &lt;map&gt; header file. Basic std::map Member FunctionsSome basic functions associated with std::
8 min read
Multiset in C++ Standard Template Library (STL)
Multisets are a type of associative containers similar to the set, with the exception that multiple elements can have the same values. Some Basic Functions associated with multiset: begin() - Returns an iterator to the first element in the multiset --&gt; O(1)end() - Returns an iterator to the theoretical element that follows the last element in th
6 min read
Queue in C++ Standard Template Library (STL)
Queues are a type of container adaptors that operate in a first in first out (FIFO) type of arrangement. Elements are inserted at the back (end) and are deleted from the front. Queues use an encapsulated object of deque or list (sequential container class) as its underlying container, providing a specific set of member functions to access its eleme
3 min read
Deque in C++ Standard Template Library (STL)
Double-ended queues are sequence containers with the feature of expansion and contraction on both ends. They are similar to vectors, but are more efficient in case of insertion and deletion of elements. Unlike vectors, contiguous storage allocation may not be guaranteed. Double Ended Queues are basically an implementation of the data structure doub
4 min read
Practice Tags :
three90RightbarBannerImg