c++c++17stdc++20erase-remove-idiom

Does C++ standard library provide more compact and generalized version of the erase–remove idiom?


We can erase one element/ entry from a container by the popular erase–remove idiom. However, many of us would have encountered some problems while applying this idiom:


Do we have anything generalized and less typo-prone than std::erase-std::remove_if or something like std::erase_if within the scope of , or will there be such a utility in ?


Solution

  • Not in the scope of , but onwards!

    Yes. The proposal of consistent container erasure has been mentioned in n4009 paper and finally adopted in C++20 standard as std::erase_if which is a non-member function for each containers.

    This ensures a uniform container erasure semantics for std::basic_string and all standard containers, except std::array(as it has the fixed-size).

    This means that the boilerplate code

    container.erase(
        std::remove_if(
            container.begin(), container.end(),
            [](const auto& element) ->bool { return /* condition */; }),
        vec.end());
    

    will simply melt down to a generalized form of

    std::erase_if(container, [](const auto& element) ->bool { return /* condition */; });
    

    Secondly, this uniform syntax selects the proper semantics for each container. This means


    In addition to that, the standard also added std::erase for sequence containers of the form

    std::erase(container, value_to_be_removed);