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 Method | Description | Example |
|---|---|---|
| erase(key) | Removes element with given key if it exists | s.erase(5); |
| erase(iterator) | Removes element at iterator position | auto 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.