C++ set example – Set c++ example – C++ Set example and Tutorial – Part 1

Set c++ example: In the previous article, we have discussed about C++ std::set example and tutorial with user defined classes. Let us learn how to Set example and Tutorial – Part 1 in C++ Program.

Set Example and Tutorial

C++ set example: In this we will discuss how to use std::set  with default sorting criteria.

What is std::set :

Std::set is a associative container that contains a sorted set of unique objects of type key.

Properties of std::set :

  • std::set internally store elements in balanced binary tree.
  • It doesn’t allow duplicate elements.
  • It can contain elements of any specified type in template argument.
  • By default it uses the operator < for comparing two elements but if user passes external sorting criteria then it will use that instead of default operator.
  • std::set will keep the inserted elements in sorted order based on the assigned sorting criteria i.e. either by default criteria operator < or by passed comparator (if passed).

Example Program using std::set :

#include<iostream>
#include<set>
#include<string>
int main()
{
    std::set<std::string> animals;

    //Insert elements
    animals.insert("Dog");
    animals.insert("Cat");
    animals.insert("Cow");
    animals.insert("Rabbit");
    animals.insert("Dog");
    animals.insert("Lion");
    animals.insert("Panda");
    animals.insert("Tiger");
    animals.insert("Deer");
    animals.insert("Bear");
    animals.insert("Elephant");
    animals.insert("Zebra");
    animals.insert("Giraffe");
    animals.insert("Panda");

    //It will show the total number of unique elements
    std::cout<<"Set Size = "<<animals.size()<<std::endl;

    //Iterate through all the elements in a set and display the set
    for (std::set<std::string>::iterator it=animals.begin(); it!=animals.end(); ++it)
        std::cout << ' ' << *it<<std::endl;
    std::cout<<"\n";
    return 0;
}
Output:

Set Size = 12
Bear
Cat
Cow
Deer
Dog
Elephant
Giraffe
Lion
Panda
Rabbit
Tiger
Zebra

It only counts the number of unique elements i.e. 12 and ignore repeated elements.

Here total number of elements passed is 14 and repeated elements are 2 which is “Dog” and “Panda”. So, it counts 12(14 – 2=12).

Iterating through std::set :

CPP set: Now we will see how to iterate through std::set.

We can use iterators i.e.

int main()
{
    std::set<std::string> animals;
    
    //Insert elements
    animals.insert("Dog");
    animals.insert("Cat");
    animals.insert("Rabbit");
    animals.insert("Panda");
    animals.insert("Elephant");
    animals.insert("Giraffe");
    
    //Iterate through all the elements in a set and display the value
    for (std::set<std::string>::iterator it=animals.begin(); it!=animals.end(); ++it)
        std::cout << ' ' << *it<<std::endl;
    std::cout<<"\n";
    return 0;
}
Output :

Cat
Dog
Elephant
Giraffe
Panda
Rabbit

Note : But we cannot modify the elements using iterators because if we modify the element value then internal data structure of std::set will get corrupt and it will not remain balanced binary search tree. Hence further additions and find operations will not work properly.

Searching an element in std::set :

It will search the container for an element equivalent to value and returns an iterator to it if found, otherwise it returns an iterator to set::end.

Let’s try with an example:

#include<iostream>
#include<set>
#include<string>
int main()
{
    std::set<std::string> animals;
    
    //Insert elements
    animals.insert("Dog");
    animals.insert("Cat");
    animals.insert("Rabbit");
    animals.insert("Panda");
    animals.insert("Elephant");
    animals.insert("Giraffe");
    
    //Search element using find member functions
    std::set<std::string>::iterator it = animals.find("Panda");
    if(it != animals.end())
        std::cout<<"'Panda'  found"<<std::endl;
    else
        std::cout<<"'Panda' not found"<<std::endl;
    
    it = animals.find("Lion");
    if(it != animals.end())
        std::cout<<"'Lion'  found"<<std::endl;
    else
        std::cout<<"'Lion' not found"<<std::endl;
    
    it = animals.find("Bear");
    if(it == animals.end())
        std::cout<<"'Bear' not found"<<std::endl;
    else
        std::cout<<"'Bear' found"<<std::endl;
    return 0;
}

Output :

'Panda'  found
'Lion' not found
'Bear' not found

Using std::set::find member method instead of std::find standard generic algorithm ?

Because it will take lesser time then standard algorithm i.e. std::find.

We should use std::set::find member method because find member function knows its internal data structure is balance binary tree and hence designed to corporate on that only. This is the reason why why it takes lesser time then standard algorithm which is std::find.

Verifying during insertion, if element is already added or not :

As we all know std::set uses operator < by default.

It internally maintains binary balanced tree and when we insert elements then it will compare the element with the existing elements and if that element already exist then it doesn’t insert that element and if it will not present then it will insert that element.

But what if it uses the operator < for comparison of two elements then think what will happen if  it checks the two elements are equal or not with < operator. Let’s take two variables a and b. if a<b is false and b<a is false then it means a and b are equal.

#include<iostream>
#include<set>
std::set<int> number;
void check(int n)
{
  if(number.insert(n).second)
     std::cout<<"'"<<n<<"' inserted successfully\n";
 else
     std::cout<<"'"<<n<<"' was already exist\n";
}
int main()
{
    check(6);
    check(1);
    check(2);
    check(1);
    
   //Gives total number unique elements
   std::cout<<"Total number of unique elements: "<<number.size()<<std::endl;
   
   // Iterate through all the elements in a set and display the value.
   for (std::set<int>::iterator it=number.begin(); it!=number.end(); ++it)
      std::cout<< ' '<<"\n" << *it;
   std::cout<<"\n"<<"Above are unique elements";
 return 0;
}

Output :

'6' inserted successfully
'1' inserted successfully
'2' inserted successfully
'1' was already exist
Total number of unique elements: 3
1
2
6
Above are unique elements

Removing an element in std::set :

We can remove an element in std::set by using member erase.

Let’s try with an example:

#include<iostream>
#include<set>
#include<string>
int main()
{
    std::set<std::string> animals;
    
    //Insert elements
    animals.insert("Dog");
    animals.insert("Cat");
    animals.insert("Lion");
    animals.insert("Tiger");
    
    // Iterate through all the elements in a set and display the value.
    for (std::set<std::string>::iterator it=animals.begin(); it!=animals.end(); ++it)
        std::cout << ' '<< *it;
        std::cout<<"  -> Before removing an element 'Lion'";
    std::cout<<std::endl;
    //Remove element "Lion"
    animals.erase("Lion");
    
    for (std::set<std::string>::iterator it=animals.begin(); it!=animals.end(); ++it)
            std::cout << ' ' << *it;
            std::cout<<"  -> After removing an element 'Lion'";
    std::cout<<std::endl;
    return 0;
}
Output:

Cat Dog Lion Tiger  -> Before removing an element 'Lion'
Cat Dog Tiger  -> After removing an element 'Lion'