0
0
CppHow-ToBeginner · 3 min read

How to Erase Elements from std::set in C++

In C++, you can erase elements from a std::set using the erase method. You can remove by specifying a key, an iterator to an element, or a range of iterators. This method efficiently removes elements while maintaining the set's order.
📐

Syntax

The erase method in std::set has three common forms:

  • set.erase(key); - Removes the element with the specified key.
  • set.erase(iterator); - Removes the element at the given iterator position.
  • set.erase(iterator_first, iterator_last); - Removes all elements in the range [iterator_first, iterator_last).

Each form modifies the set by removing elements and keeps the set ordered.

cpp
std::set<int> s = {1, 2, 3, 4, 5};

// Erase by key
s.erase(3); // removes element '3'

// Erase by iterator
auto it = s.find(4);
s.erase(it); // removes element '4'

// Erase by range
auto it1 = s.find(1);
auto it2 = s.find(3);
s.erase(it1, it2); // removes elements '1' and '2'
💻

Example

This example shows how to erase elements from a std::set by key, iterator, and range. It prints the set before and after each erase operation.

cpp
#include <iostream>
#include <set>

int main() {
    std::set<int> numbers = {10, 20, 30, 40, 50};

    std::cout << "Original set: ";
    for (int n : numbers) std::cout << n << ' ';
    std::cout << '\n';

    // Erase by key
    numbers.erase(30);
    std::cout << "After erasing key 30: ";
    for (int n : numbers) std::cout << n << ' ';
    std::cout << '\n';

    // Erase by iterator
    auto it = numbers.find(40);
    if (it != numbers.end()) {
        numbers.erase(it);
    }
    std::cout << "After erasing element at iterator (40): ";
    for (int n : numbers) std::cout << n << ' ';
    std::cout << '\n';

    // Erase by range
    auto it1 = numbers.find(10);
    auto it2 = numbers.find(50);
    numbers.erase(it1, it2); // removes 10, 20, and 40
    std::cout << "After erasing range [10, 50): ";
    for (int n : numbers) std::cout << n << ' ';
    std::cout << '\n';

    return 0;
}
Output
Original set: 10 20 30 40 50 After erasing key 30: 10 20 40 50 After erasing element at iterator (40): 10 20 50 After erasing range [10, 50): 50
⚠️

Common Pitfalls

Common mistakes when erasing from a std::set include:

  • Trying to erase an element by key that does not exist, which does nothing but may confuse beginners.
  • Using an invalid or end iterator in erase(iterator), which causes undefined behavior.
  • Erasing a range where the first iterator is after the last iterator, which is invalid.

Always check if the iterator is valid before erasing and ensure the range is correct.

cpp
#include <set>
#include <iostream>

int main() {
    std::set<int> s = {1, 2, 3};

    // Wrong: erasing with invalid iterator (end())
    // s.erase(s.end()); // undefined behavior!

    // Right: check iterator before erase
    auto it = s.find(4);
    if (it != s.end()) {
        s.erase(it);
    } else {
        std::cout << "Element 4 not found, cannot erase.\n";
    }

    // Wrong: erasing range with wrong order
    // s.erase(s.find(3), s.find(1)); // invalid range

    // Right: erase range with correct order
    s.erase(s.find(1), s.find(3)); // erases 1 and 2

    for (int x : s) std::cout << x << ' ';
    std::cout << '\n';

    return 0;
}
Output
Element 4 not found, cannot erase. 3
📊

Quick Reference

Summary of std::set erase methods:

Erase MethodDescriptionExample
erase(key)Removes element with given key if it existss.erase(5);
erase(iterator)Removes element at iterator positionauto it = s.find(3); s.erase(it);
erase(iterator_first, iterator_last)Removes elements in range [first, last)s.erase(s.begin(), s.find(4));

Key Takeaways

Use std::set::erase with a key, iterator, or iterator range to remove elements.
Always check if an iterator is valid before erasing to avoid errors.
Erasing by key removes the element if it exists; otherwise, it does nothing.
Erasing by range removes all elements in the specified iterator interval.
Invalid iterators or ranges cause undefined behavior, so be careful.