从std :: list中删除具有特定值的元素

jac*_*hab 5 c++ stl list

我需要从std :: list中删除具有特定值的元素.用list<int>我用的remove()方法.

现在我已经list<CMyClass>这样认为我应该使用remove_if()但它的谓词只需要一个参数 - 要测试的元素.

如何编写一个foo(const CMyClass &Bad)从列表中删除所有等于Bad的元素的函数?

谢谢

PS

struct CMyClass {
    void *Ptr;
    int Var;
}

bool is_equal(const CMyClass &A, const CMyClass &B)
{
    if (A.Ptr == B.Prt and A.Var == B.Var)
        return true;
    else
        return false;
}
Run Code Online (Sandbox Code Playgroud)

Myk*_*yev 15

您的类必须在ClassName中实现operator ==

bool operator == ( const Class& rhs );
Run Code Online (Sandbox Code Playgroud)

然后你可以使用

list.remove( Bad )
Run Code Online (Sandbox Code Playgroud)

如果你的类有合理的运算符==(不仅仅是删除) - 比list :: remove对你有好处.如果operator ==仅用于list :: remove,则最好使用remove_if.

在以下示例中,演示了list :: remove和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;
}
Run Code Online (Sandbox Code Playgroud)


dal*_*lle 6

要根据谓词删除所有元素:

struct Pred
{
   bool operator()(int i) const
   {
      return i == 42;
   }
};

std::list<int> l = ...;
l.remove_if(Pred());
Run Code Online (Sandbox Code Playgroud)

或者删除值为42的所有元素:

std::list<int> l = ...;
l.remove(42);
Run Code Online (Sandbox Code Playgroud)

或者CMyClass列表:

struct Pred
{
   bool operator()(const CMyClass& item) const
   {
      return item.GetSomething() == 42 && item.GetSomethingElse() == 314159;
   }
};

std::list<CMyClass> l = ...;
l.remove_if(Pred());
Run Code Online (Sandbox Code Playgroud)