#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;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8c2V0PgoKdGVtcGxhdGU8dHlwZW5hbWUgQ29udCwgdHlwZW5hbWUgUHJlZD4Kdm9pZCBiaWRpcl9yZW1vdmVfaWYoIENvbnQgJmMsIFByZWQgcCwgYm9vbCBmb3J3YXJkICkKewogICAgYXV0byBiID0gYy5iZWdpbigpOwogICAgYXV0byBlID0gYy5lbmQoKTsKICAgIHdoaWxlKCBiICE9IGUgKSB7CiAgICAgICBhdXRvIGl0ID0gZm9yd2FyZCA/IGIrKyA6IC0tZTsKICAgICAgIGlmKCBwKCppdCkgKSB7CiAgICAgICAgICAgYXV0byBlbmQgPSBiID09IGU7CiAgICAgICAgICAgKCBmb3J3YXJkID8gaXQgOiBlICkgPSBjLmVyYXNlKCBpdCApOwogICAgICAgICAgIGlmKCBlbmQgKSBicmVhazsKICAgICAgIH0KICAgIH0KfQoKaW50IG1haW4oKQp7CiAgICBzdGQ6OnNldDxpbnQ+IHMxID0geyAxLDIsMyw0LDUgfTsKICAgIGF1dG8gczIgPSBzMTsKICAgIGF1dG8gcCA9IFtdKCBpbnQgaSApIHsKICAgICAgICBzdGQ6OmNvdXQgPDwgaSA8PCAiICI7CiAgICAgICAgcmV0dXJuIGkgJSAyOwogICAgfTsKICAgIGJpZGlyX3JlbW92ZV9pZiggczEsIHAsIHRydWUgKTsKICAgIHN0ZDo6Y291dCA8PCBzdGQ6OmVuZGw7CiAgICBmb3IoIGludCBpIDogczEgKSBzdGQ6OmNvdXQgPDwgaSA8PCAiICI7CiAgICBzdGQ6OmNvdXQgPDwgc3RkOjplbmRsOwogICAgYmlkaXJfcmVtb3ZlX2lmKCBzMiwgcCwgZmFsc2UgKTsKICAgIHN0ZDo6Y291dCA8PCBzdGQ6OmVuZGw7CiAgICBmb3IoIGludCBpIDogczIgKSBzdGQ6OmNvdXQgPDwgaSA8PCAiICI7CiAgICBzdGQ6OmNvdXQgPDwgc3RkOjplbmRsOwp9Cg==