Erase–remove idiom

The erase–remove idiom is a common C++ technique to eliminate elements that fulfill a certain criterion from a C++ Standard Library container.

Motivation
A common programming task is to remove all elements that have a certain value or fulfill a certain criterion from a collection. In C++, this can be achieved using a hand-written loop. It is, however, preferable to use an algorithm from the C++ Standard Library for such tasks.

The member function  can be used to delete an element from a collection, but for containers which are based on an array, such as , all elements after the deleted element have to be moved forward to avoid "gaps" in the collection. Calling erase multiple times on the same container generates much overhead from moving the elements.

The  library provides the   and   algorithms for this. Because these algorithms operate on a range of elements denoted by two forward iterators, they have no knowledge of the underlying container or collection.

These algorithms do not remove elements from the container, but move all elements that do not fit the removal criteria to the front of the range, keeping the relative order of the elements. This is done in a single pass through the data range.

As no elements are actually removed and the container retains the same size, the tail of the array has a length equal to the number of "removed" items; these items remain in memory but in an unspecified state. returns an iterator pointing to the first of these tail elements so that they can be deleted using a single call to.

Doing the same using only  results in as many passes as there are elements to remove. For each of these passes, all elements after the erased element have to be moved, which is more time-consuming than shifting elements in a single pass.

C++20
As of C++20, the free functions  and   are provided for STL containers. These convenience functions can be used to perform correct erasure of elements without requiring the programmer to explicitly use the erase-remove idiom.

Limitation
The erase–remove idiom cannot be used for containers that return  (e.g.: set)

and/or  do not maintain elements that are removed (unlike ,  ). Thus, erase–remove can only be used with containers holding elements with full value semantics without incurring resource leaks.

Example
Compiler Explorer