|
1 | 1 | --- |
2 | 2 | Title: 'erase()' |
3 | | -Description: 'removes elements from an unordered set' |
4 | | -Subjects: |
5 | | - - 'Computer Science' |
6 | | -Tags: |
7 | | - - 'Methods' |
8 | | - - 'unordered-sets' |
| 3 | +Description: 'Removes one or more specified elements from the unordered_set.' |
| 4 | +Subjects: |
| 5 | + - 'Computer Science' |
| 6 | + - 'Game Development' |
| 7 | +Tags: |
| 8 | + - 'Methods' |
| 9 | + - 'Sets' |
9 | 10 | CatalogContent: |
10 | | - - 'learn-C++' |
11 | | - - 'paths/computer-science' |
| 11 | + - 'learn-c-plus-plus' |
| 12 | + - 'paths/computer-science' |
12 | 13 | --- |
13 | 14 |
|
14 | | -# 'C++ Unordered-sets: erase()' |
15 | | - |
16 | | -The 'erase()' function removes elements from an unordered set. |
17 | | -It can erase a single element by key, a single element by iterator, or a range of elements using two iterators. |
18 | | -Only iterators pointing to erased elements are invalidated; all others remain valid. |
| 15 | +The **`erase()`** function removes elements from an `unordered_set`. It can erase a single element by key, a single element by iterator, or a range of elements using two iterators, and only iterators pointing to erased elements are invalidated while the rest remain valid. |
19 | 16 |
|
20 | 17 | ## Syntax |
21 | 18 |
|
22 | | -Erase by Key |
23 | | -``` |
24 | | -size_t erase(const Key& key); |
25 | | -``` |
| 19 | +The `erase()` function removes elements from an `unordered_set` in three ways: by key, by iterator, or by a range of iterators: |
26 | 20 |
|
27 | | -Erase by Iterator |
28 | | -``` |
29 | | -iterator erase(const_iterator pos); |
| 21 | +```pseudo |
| 22 | +set.erase(key); // erase by key |
| 23 | +set.erase(iterator); // erase by iterator |
| 24 | +set.erase(first, last); // erase by range |
30 | 25 | ``` |
31 | 26 |
|
32 | | -Erase a Range of Iterators |
33 | | -``` |
34 | | -iterator erase(const_iterator first, const_iterator last); |
35 | | -``` |
| 27 | +**Parameters:** |
| 28 | + |
| 29 | +- `key`: A value of the set’s key type. All elements matching this key are removed (at most one since `unordered_set` stores unique keys). |
| 30 | +- `iterator`: An iterator pointing to the element to remove. |
| 31 | +- `first`, `last`: A pair of iterators defining the range to erase. Removes all elements in `[first, last)`. |
36 | 32 |
|
37 | | -Erase by Key: Removes all elements matching `key` (in an `unordered_set`, that's at most one). Returns the number of elements removed. |
| 33 | +**Return value:** |
38 | 34 |
|
39 | | -Erase by Iterator: Removes the element at `pos`. Returns an iterator to the element that followed the erased one. |
| 35 | +- When erasing by key: returns the number of elements removed, as a `size_type`. |
| 36 | +- When erasing by iterator: returns an iterator pointing to the element that follows the erased one. |
| 37 | +- When erasing by range: returns an iterator pointing to the element that follows the last erased element. |
40 | 38 |
|
41 | | -Erase a Range of Iterators: Removes all elements in the half-open range `[first, last]`. Returns an iterator to the element that followed the last removed one. |
| 39 | +## Example 1: Erasing by key, iterator, and range |
42 | 40 |
|
43 | | -## Example |
| 41 | +In this example the program removes elements using all three `erase()` overloads and prints the remaining contents of the `unordered_set`: |
44 | 42 |
|
45 | 43 | ```cpp |
46 | 44 | #include <iostream> |
47 | 45 | #include <unordered_set> |
48 | 46 |
|
49 | 47 | int main() { |
50 | | - std::unordered_set<int> numbers = {1, 2, 3, 4, 5}; |
| 48 | + std::unordered_set<int> numbers = {1, 2, 3, 4, 5}; |
51 | 49 |
|
52 | | - // Erase by key |
53 | | - numbers.erase(3); |
| 50 | + // Erase by key |
| 51 | + numbers.erase(3); |
54 | 52 |
|
55 | | - // Erase by iterator |
56 | | - auto it = numbers.find(4); |
57 | | - if (it != numbers.end()) { |
58 | | - numbers.erase(it); |
59 | | - } |
| 53 | + // Erase by iterator |
| 54 | + auto it = numbers.find(4); |
| 55 | + if (it != numbers.end()) { |
| 56 | + numbers.erase(it); |
| 57 | + } |
60 | 58 |
|
61 | | - // Erase using a range |
62 | | - auto first = numbers.begin(); |
63 | | - auto last = numbers.find(5); |
64 | | - numbers.erase(first, last); |
| 59 | + // Erase using a range |
| 60 | + auto first = numbers.begin(); |
| 61 | + auto last = numbers.find(5); |
| 62 | + numbers.erase(first, last); |
65 | 63 |
|
66 | | - for (int n : numbers) { |
67 | | - std::cout << n << " "; // expected output: 5 |
68 | | - } |
| 64 | + for (int n : numbers) { |
| 65 | + std::cout << n << " "; |
| 66 | + } |
| 67 | + |
| 68 | + return 0; |
69 | 69 | } |
70 | 70 | ``` |
71 | | -## Codebyte |
72 | | - |
73 | | -The following example creates an `unordered_set<int>`, then demonstrates all three `erase()` overloads: |
74 | | -* Erasing by key |
75 | | -* Erasing by iterators |
76 | | -* Erasing by iterator range |
77 | 71 |
|
78 | | -```codebyte/cpp |
79 | | -#include <iostream> |
80 | | -#include <unordered_set> |
| 72 | +The output of this code is: |
81 | 73 |
|
82 | | -int main() { |
83 | | - std::unordered_set<int> s = {1, 2, 3, 4, 5}; |
| 74 | +```shell |
| 75 | +5 2 1 |
| 76 | +``` |
84 | 77 |
|
85 | | - // 1. Erase by key |
86 | | - s.erase(3); |
87 | | - // set is now {1, 2, 4, 5} |
| 78 | +> **Note:** The order and even the elements removed by a range erase depend on the internal bucket ordering of the `unordered_set`, which is not guaranteed. The final printed sequence may vary across systems. |
88 | 79 |
|
89 | | - // 2. Erase by iterator |
90 | | - auto it = s.find(4); |
91 | | - if (it != s.end()) { |
92 | | - s.erase(it); |
93 | | - } |
94 | | - // set is now {1, 2, 5} |
| 80 | +## Codebyte Example |
95 | 81 |
|
96 | | - // 3. Erase by iterator range |
97 | | - auto first = s.begin(); |
98 | | - auto last = s.end(); |
99 | | - // this removes everything in the set |
100 | | - s.erase(first, last); |
| 82 | +In this example the program demonstrates each `erase()` form and prints the set contents after every removal step: |
101 | 83 |
|
102 | | - // set is now empty |
| 84 | +```codebyte/cpp |
| 85 | +#include <iostream> |
| 86 | +#include <unordered_set> |
103 | 87 |
|
104 | | - return 0; |
| 88 | +int main() { |
| 89 | + std::unordered_set<int> s = {1, 2, 3, 4, 5}; |
| 90 | +
|
| 91 | + // 1. Erase by key |
| 92 | + s.erase(3); |
| 93 | + std::cout << "After erasing 3: "; |
| 94 | + for (int v : s) std::cout << v << " "; |
| 95 | + std::cout << "\n"; |
| 96 | +
|
| 97 | + // 2. Erase by iterator |
| 98 | + auto it = s.find(4); |
| 99 | + if (it != s.end()) { |
| 100 | + s.erase(it); |
| 101 | + } |
| 102 | + std::cout << "After erasing iterator to 4: "; |
| 103 | + for (int v : s) std::cout << v << " "; |
| 104 | + std::cout << "\n"; |
| 105 | +
|
| 106 | + // 3. Erase by iterator range |
| 107 | + auto first = s.begin(); |
| 108 | + auto last = s.end(); |
| 109 | + s.erase(first, last); |
| 110 | +
|
| 111 | + std::cout << "After erasing full range: "; |
| 112 | + for (int v : s) std::cout << v << " "; |
| 113 | + std::cout << "(empty)\n"; |
| 114 | +
|
| 115 | + return 0; |
105 | 116 | } |
106 | 117 | ``` |
0 commit comments