Namespaces
Variants
Views
Actions

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 {{tt|[first, last)}}.
+
@2@ Removes the elements in the range {{range|first|last}}.
  
{{cpp/container/note_iterator_invalidation|{{{1|}}}|erase}}
+
{{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 {{tt|[first, last)}} is an empty range, then {{c|last}} is returned.
+
@@ 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 made<br>the behavior of clearing an empty {{tt|{{{1|}}}}} undefined|after=not required if<br>{{c|1= first == last}}}}
+
{{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 [firstlast).

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 [firstlast) is an empty range, then last is returned.

Exceptions

Complexity

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

clears the contents
(public member function of std::{{{1}}}) [edit]