#include <iostream>
#include <set>

template<typename Cont, typename Pred>
void bidir_remove_if( Cont &c, Pred p, bool forward )
{
    auto b = c.begin();
    auto e = c.end();
    while( b != e ) {
       auto it = forward ? b++ : --e;
       if( p(*it) ) {
           auto end = b == e;
           ( forward ? it : e ) = c.erase( it );
           if( end ) break;
       }
    }
}

int main()
{
    std::set<int> s1 = { 1,2,3,4,5 };
    auto s2 = s1;
    auto p = []( int i ) {
        std::cout << i << " ";
        return i % 2;
    };
    bidir_remove_if( s1, p, true );
    std::cout << std::endl;
    for( int i : s1 ) std::cout << i << " ";
    std::cout << std::endl;
    bidir_remove_if( s2, p, false );
    std::cout << std::endl;
    for( int i : s2 ) std::cout << i << " ";
    std::cout << std::endl;
}
