In this article we will discuss different ways to remove an element from Set.
std::set provides 3 overloaded version of erase() member function. We will discuss them one by one.
Suppose we have a set of strings i.e.
//Set Of Strings std::set<std::string> setOfStrs = {"Hi", "Hello", "is", "the", "at", "Hi", "is", "from", "that"};
Let’s remove elements from it i.e.
std::set provides an overloaded version of erase function that accepts an iterator and removes the element pointed by the iterator i.e.
iterator erase (const_iterator position);
It returns the element next to the last deleted element. Let’s use this to remove an element from above set of strings i.e.
// Search for element "is" std::set<std::string>::iterator it = setOfStrs.find("is"); // Check if Iterator is valid if(it != setOfStrs.end()) { // Deletes the element pointing by iterator it setOfStrs.erase(it); }
std::set provides an overloaded version of erase function that accepts a value and removes that from set i.e.
size_type erase (const value_type& val);
It returns the number of elements deleted. As std::set contains only unique elements, so its value will always be 1.
Let’s use this to remove an element from above set of strings i.e.
// Erase element "that" from set setOfStrs.erase("that");
std::set provides an overloaded version of erase function that accepts two iterators representing a range from (start) to (end -1) i.e.
iterator erase (const_iterator first, const_iterator last);
It removes all the elements in the given range and returns the element next to the last deleted element.
Let’s use this to remove elements from above set of strings i.e.
// Iterator pointing to "Hi" in Set std::set<std::string>::iterator start = setOfStrs.find("Hi"); // Iterator pointing to "from" in Set std::set<std::string>::iterator last = setOfStrs.find("from"); // Check if both start and last iterators are valid if(start != setOfStrs.end() && last != setOfStrs.end()) { // Erase all elements from "Hi" to "from" setOfStrs.erase(start, last); }
Complete example is as follows,
#include <iostream> #include <set> #include <iterator> #include <string> #include <vector> int main() { //Set Of Strings std::set<std::string> setOfStrs = {"Hi", "Hello", "is", "the", "at", "Hi", "is", "from", "that"}; // Printing Contents of Set std::copy (setOfStrs.begin(), setOfStrs.end(), std::ostream_iterator<std::string>(std::cout, ", ")); std::cout<<std::endl; // Search for element "is" std::set<std::string>::iterator it = setOfStrs.find("is"); // Check if Iterator is valid if(it != setOfStrs.end()) { // Deletes the element pointing by iterator it setOfStrs.erase(it); } // Printing Contents of Set std::copy (setOfStrs.begin(), setOfStrs.end(), std::ostream_iterator<std::string>(std::cout, ", ")); std::cout<<std::endl; // Iterator pointing to "Hi" in Set std::set<std::string>::iterator start = setOfStrs.find("Hi"); // Iterator pointing to "from" in Set std::set<std::string>::iterator last = setOfStrs.find("from"); // Check if both start and last iterators are valid if(start != setOfStrs.end() && last != setOfStrs.end()) { // Erase all elements from "Hi" to "from" setOfStrs.erase(start, last); } // Printing Contents of Set std::copy (setOfStrs.begin(), setOfStrs.end(), std::ostream_iterator<std::string>(std::cout, ", ")); std::cout<<std::endl; // Erase element "that" from set setOfStrs.erase("that"); // Printing Contents of Set std::copy (setOfStrs.begin(), setOfStrs.end(), std::ostream_iterator<std::string>(std::cout, ", ")); std::cout<<std::endl; return 0; }
Output:
Hello, Hi, at, from, is, that, the, Hello, Hi, at, from, that, the, Hello, from, that, the, Hello, from, the,