Your class must implement operator == in its ClassName
bool operator == ( const Class& rhs );
and then you can use
list.remove( Bad )
If it is reasonable for your class to have the == operator (not just for deletion), then the list :: remove list is right for you. If the == operator is only for the :: remove list, then it is better to use remove_if.
The following example shows the list :: remove and list :: remove_if.
struct Class { int a_; int b_; Class( int a, int b ): a_( a ), b_( b ) {} bool operator == (const Class &rhs) { return (rhs.a_ == a_ && rhs.b_ == b_); } void print() { std::cout << a_ << " " << b_ << std::endl; } }; bool isEqual( Class lhs, Class rhs ) { return (rhs.a_ == lhs.a_ && rhs.b_ == lhs.b_); } struct IsEqual { IsEqual( const Class& value ): value_( value ) {} bool operator() (const Class &rhs) { return (rhs.a_ == value_.a_ && rhs.b_ == value_.b_); } Class value_; }; int main() { std::list<Class> l; l.push_back( Class( 1, 3 ) ); l.push_back( Class( 2, 5 ) ); l.push_back( Class( 3, 5 ) ); l.push_back( Class( 3, 8 ) ); Class bad( 2, 5 ); std::cout << "operator == " << std::endl; l.remove( bad ); std::for_each( l.begin(), l.end(), std::mem_fun_ref( &Class::print ) ); std::cout << "binary function predicat" << std::endl; l.push_back( Class( 2, 5 ) ); l.remove_if( std::bind2nd( std::ptr_fun(isEqual), bad ) ); std::for_each( l.begin(), l.end(), std::mem_fun_ref( &Class::print ) ); std::cout << "functor predicat" << std::endl; l.push_back( Class( 2, 5 ) ); l.remove_if( IsEqual( bad ) ); std::for_each( l.begin(), l.end(), std::mem_fun_ref( &Class::print ) ); return 0; }
source share