...

/

Use Uniform Erasure Functions to Delete Items from a Container

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 erase-remove idiomThe erase-remove idiom is a programming technique used to remove elements from a container (such as a vector) based on a specified condition. was commonly used to efficiently delete elements from an STL container. This was a little cumbersome, but not a great burden. It was common to use a function like this for the task:

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 ...