Difference between revisions of "Template:cpp/container/erase"
Andreas Krug (Talk | contribs) m (fmt) |
Andreas Krug (Talk | contribs) m (.) |
||
Line 70: | Line 70: | ||
@2@ Linear in the distance between {{c|first}} and {{c|last}}. | @2@ Linear in the distance between {{c|first}} and {{c|last}}. | ||
|vector= | |vector= | ||
− | Linear: the number of calls to the destructor of T is the same as the number of elements erased, the assignment operator of T is called the number of times equal to the number of elements in the vector after the erased elements | + | Linear: the number of calls to the destructor of T is the same as the number of elements erased, the assignment operator of T is called the number of times equal to the number of elements in the vector after the erased elements. |
|deque= | |deque= | ||
− | Linear: the number of calls to the destructor of T is the same as the number of elements erased, the number of calls to the assignment operator of T is no more than the lesser of the number of elements before the erased elements and the number of elements after the erased elements | + | Linear: the number of calls to the destructor of T is the same as the number of elements erased, the number of calls to the assignment operator of T is no more than the lesser of the number of elements before the erased elements and the number of elements after the erased elements. |
|{{templated}} | |{{templated}} | ||
}} | }} | ||
Line 87: | Line 87: | ||
|vector | |vector | ||
|deque= | |deque= | ||
+ | | | ||
#include <iterator> | #include <iterator> | ||
}} | }} |
Revision as of 10:17, 27 September 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.
[
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.
[
first,
last)
is an empty range, then last is returned.Exceptions
Templated information. See page source. |
Complexity
Templated information. See page source. |
Notes
When container elements need to be erased based on a predicate, rather than iterating the container and calling unary erase
, the iterator range overload is generally used with std::remove()/std::remove_if() to minimise the number of moves of the remaining (non-removed) elements, this is the erase-remove idiom. std::erase_if()
replaces the erase-remove idiom.(since C++20)
Example
#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
(C++20) |
erases all elements satisfying specific criteria (function template) |
clears the contents (public member function of std::{{{1}}} )
|