c++algorithmfunctionvectorerase-remove-idiom

erase-remove_if idiom - was anything removed?


I'm creating an API which users will call to remove items from an internal vector. They will pass in criteria to search the vector for elements to remove. I'd like my API to return a boolean for if any elements were found and removed.

I'm planning on using the erase-remove idiom to keep things simple and efficient. I don't see an obvious way right off to detect that items were actually removed? Is storing the number of elements in the vector before removing, and comparing the value, my best bet?

Here is some (untested) sample code on this idiom:

std::vector<int> v = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };

boolean removeMultiples(int multiple) {
    v.erase( std::remove_if(v.begin(), v.end(), [multiple](int i){return i%multiple == 0;}), v.end() );
    // return true if anything was removed
}

Solution

  • One idea would be to store the return value of std::remove_if, and compare it with the containers end() iterator before doing the erase like this:

    bool removeMultiples(int multiple)
    {
        auto it = std::remove_if(v.begin(), v.end(), [multiple](int i){return i%multiple == 0;});
        bool any_change = it != v.end();
        v.erase(it, v.end());
        return any_change;
    }