Use Uniform Erasure Functions to Delete Items from a Container
Learn to use uniform erasure functions to delete items from a container.
We'll cover the following...
Before C++20, the
template<typename Tc, typename Tv>void remove_value(Tc & c, const Tv v) {auto remove_it = std::remove(c.begin(), c.end(), v);c.erase(remove_it, c.end());}
The std::remove()
function is from the <algorithms>
header. std::remove()
searches for the specified value and removes it by shifting elements forward from the end of the container. It does not change the size of the container. It returns an iterator past the end of the shifted range. We then call the container's erase()
function to delete the remaining elements.
This two-step process is now reduced to one step with the new uniform erasure function:
std::erase(c, 5); // same as remove_value() function
This one function call does the same thing as the remove_value()
function we wrote above.
There's also a version that uses a predicate function. For example, to remove all even numbered values from a numeric container:
std::erase_if(c, [](auto x) { return x % 2 == 0; });
Let's look at the uniform erasure functions in a bit more detail.
How to do it
There are two forms of the uniform erasure functions. The first form, called erase()
, takes two parameters, a container and a value:
erase(container, value);
The container may be any of the sequential containers (vector
, list
, forward_list
, deque
), except array
, which cannot change size.
The second form, called erase_if()
, takes a container and a predicate function:
erase_if(container, predicate);
This form works with any of ...