Different ways to Erase / Delete an element from a Set in C++

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.

Removing element from set By Iterator

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);
}

Advertisements

Removing element from set By Value

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");

Removing element from set By Iterator Range

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,

 

Do you want to Learn Modern C++ from best?

We have curated a list of Best C++ Courses, that will teach you the cutting edge Modern C++ from the absolute beginning to advanced level. It will also introduce to you the word of Smart Pointers, Move semantics, Rvalue, Lambda function, auto, Variadic template, range based for loops, Multi-threading and many other latest features of C++ i.e. from C++11 to C++20.

Check Detailed Reviews of Best Modern C++ Courses

Remember, C++ requires a lot of patience, persistence, and practice. So, start learning today.

Leave a Comment

Your email address will not be published.

This site uses Akismet to reduce spam. Learn how your comment data is processed.

Scroll to Top