Difference between revisions of "Template:cpp/container/erase"
From cppreference.com
m (Minor fix.) |
(Added LWG issue #638 DR.) |
||
Line 26: | Line 26: | ||
@1@ Removes the element at {{c|pos}}. | @1@ Removes the element at {{c|pos}}. | ||
− | @2@ Removes the elements in the range {{ | + | @2@ Removes the elements in the range {{range|first|last}}. |
− | {{cpp/container/ | + | {{cpp/container/note iterator invalidation|{{{1|}}}|erase}} |
The iterator {{c|pos}} must be valid and dereferenceable. Thus the {{lc|end()}} iterator (which is valid, but is not dereferenceable) cannot be used as a value for {{c|pos}}. | The iterator {{c|pos}} must be valid and dereferenceable. Thus the {{lc|end()}} iterator (which is valid, but is not dereferenceable) cannot be used as a value for {{c|pos}}. | ||
Line 48: | Line 48: | ||
Iterator following the last removed element. | Iterator following the last removed element. | ||
− | If {{c|pos}} refers to the last element, then the {{lc|end()}} iterator is returned. | + | @1@ If {{c|pos}} refers to the last element, then the {{lc|end()}} iterator is returned. |
− | If {{c|1=last == end()}} prior to removal, then the updated {{lc|end()}} iterator is returned. | + | @2@ If {{c|1=last == end()}} prior to removal, then the updated {{lc|end()}} iterator is returned. |
− | If {{ | + | @@ If {{range|first|last}} is an empty range, then {{c|last}} is returned. |
===Exceptions=== | ===Exceptions=== | ||
Line 134: | Line 134: | ||
===Defect reports=== | ===Defect reports=== | ||
{{dr list begin}} | {{dr list begin}} | ||
− | {{dr list item|wg=lwg|dr=151|std=C++98|before={{c|first}} was required to be dereferenceable, which | + | {{dr list item|wg=lwg|dr=151|std=C++98|before={{c|first}} was required to be dereferenceable, which<br>made the behavior of clearing an empty {{tt|{{{1|}}}}} undefined|after=not required if<br>{{c|1= first == last}}}} |
{{#switch:{{{1|}}}|vector= | {{#switch:{{{1|}}}|vector= | ||
{{dr list item|wg=lwg|dr=414|std=C++98|before=iterators at the point of erase were not invalidated|after=they are also invalidated}} | {{dr list item|wg=lwg|dr=414|std=C++98|before=iterators at the point of erase were not invalidated|after=they are also invalidated}} | ||
+ | |deque= | ||
+ | {{dr list item|wg=lwg|dr=638|std=C++98|before=the end iterator was not invalidated|after=it is invalidated if the elements are<br>erased from the middle or the end}} | ||
}} | }} | ||
{{dr list end}} | {{dr list end}} |
Revision as of 01:29, 3 March 2023
(1) | ||
iterator erase( iterator pos ); |
(until C++11) | |
iterator erase( const_iterator pos ); |
(since C++11) | |
(2) | ||
iterator erase( iterator first, iterator last ); |
(until C++11) | |
iterator erase( const_iterator first, const_iterator last ); |
(since C++11) | |
Erases the specified elements from the container.
1) Removes the element at pos.
2) Removes the elements in the range
[
first,
last)
.Information on iterator invalidation is copied from here |
The iterator pos must be valid and dereferenceable. Thus the end() iterator (which is valid, but is not dereferenceable) cannot be used as a value for pos.
The iterator first does not need to be dereferenceable if first == last: erasing an empty range is a no-op.
Contents |
Parameters
pos | - | iterator to the element to remove |
first, last | - | range of elements to remove |
Return value
Iterator following the last removed element.
1) If pos refers to the last element, then the end() iterator is returned.
2) If last == end() prior to removal, then the updated end() iterator is returned.
If
[
first,
last)
is an empty range, then last is returned.Exceptions
Templated information. See page source. |
Complexity
Templated information. See page source. |
Example
Run this code
#include <{{{1}}}> #include <iostream> #include <iterator> void print_container(const std::{{{1}}}<int>& c) { for (int i : c) std::cout << i << " "; std::cout << '\n'; } int main( ) { std::{{{1}}}<int> c{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; print_container(c); c.erase(c.begin()); print_container(c); std::{{{1}}}<int>::iterator range_begin = c.begin(); std::{{{1}}}<int>::iterator range_end = c.begin(); std::advance(range_begin,2); std::advance(range_end,5); c.erase(range_begin, range_end); print_container(c); // Erase all even numbers for (std::{{{1}}}<int>::iterator it = c.begin(); it != c.end();) { if (*it % 2 == 0) it = c.erase(it); else ++it; } print_container(c); }
Output:
0 1 2 3 4 5 6 7 8 9 1 2 3 4 5 6 7 8 9 1 2 6 7 8 9 1 7 9
Defect reports
The following behavior-changing defect reports were applied retroactively to previously published C++ standards.
DR | Applied to | Behavior as published | Correct behavior |
---|---|---|---|
LWG 151 | C++98 | first was required to be dereferenceable, which made the behavior of clearing an empty undefined
|
not required if first == last |
See also
clears the contents (public member function of std::{{{1}}} )
|