# std::erase_if (std::set)

From cppreference.com
< cpp‎ | container‎ | set

Defined in header `<set>` |  |
template< class Key, class Compare, class Alloc, class Pred > typename std::set<Key, Compare, Alloc>::size_type erase_if( std::set<Key, Compare, Alloc>& c, Pred pred ); |  | (since C++20)

Erases all elements that satisfy the predicate `pred` from the container. Equivalent to

    auto old_size = c.size();
    for (auto i = c.begin(), last = c.end(); i != last; ) {
      if (pred(*i)) {
        i = c.erase(i);
      } else {
        ++i;
      }
    }
    return old_size - c.size();

### Parameters

c | - | container from which to erase
pred | - | predicate that returns true if the element should be erased

### Return value

The number of erased elements.

### Complexity

Linear.

### Example

Run this code

    #include <set>
    #include <iostream>

    template<typename Os, typename Container>
    inline Os& operator<<(Os& os, Container const& container)
    {
        os << "{ ";
        for (const auto& item : container) {
            os << item << ' ';
        }
        return os << "}";
    }

    int main()
    {
        std::set data { 3, 3, 4, 5, 5, 6, 6, 7, 2, 1, 0 };
        std::cout << "Original:\n" << data << '\n';

        auto divisible_by_3 = [](auto const& x) { return (x % 3) == 0; };

        const auto count = std::erase_if(data, divisible_by_3);

        std::cout << "Erase all items divisible by 3:\n" << data << '\n'
                  << count << " items erased.\n";
    }

Output:

    Original:
    { 0 1 2 3 4 5 6 7 }
    Erase all items divisible by 3:
    { 1 2 4 5 7 }
    3 items erased.

### See also

remove remove_if | removes elements satisfying specific criteria (function template)

Retrieved from "https://en.cppreference.com/mwiki/index.php?title=cpp/container/set/erase_if&oldid=135250"