std :: remove_if使用其他类方法

时间:2013-05-13 09:17:51

标签: c++ methods stdvector predicate remove-if

我希望std::remove_if使用谓词,该谓词是一个不同的calss的成员函数。

那是

class B;

class A {
    bool invalidB( const B& b ) const; // use members of class A to verify that B is invalid
    void someMethod() ;
};

现在,实施A::someMethod,我有

void A::someMethod() {
    std::vector< B > vectorB; 
    // filling it with elements

    // I want to remove_if from vectorB based on predicate A::invalidB
    std::remove_if( vectorB.begin(), vectorB.end(), invalidB )
}

有办法做到这一点吗?

我已经研究过了 Idiomatic C++ for remove_if,但它处理的情况略有不同,remove_if的一元谓词是B而非A的成员。

此外,
我无法访问BOOST或c ++ 11

谢谢!

2 个答案:

答案 0 :(得分:5)

进入remove_if后,您丢失了this指针 A。所以你必须声明一个持有的功能对象 它,像是:

class IsInvalidB
{
    A const* myOwner;
public:
    IsInvalidB( A const& owner ) : myOwner( owner ) {}
    bool operator()( B const& obj )
    {
        return myOwner->invalidB( obj );
    }
}

只需将此实例传递给remove_if即可。

答案 1 :(得分:2)

如果您不想创建其他仿函数并且仅限于C ++ 03,请使用std::mem_fun_refstd::bind1st

std::remove_if(vectorB.begin(), vectorB.end(),
               std::bind1st(std::mem_fun_ref(&A::invalidB), some_A));

或者,如果您的编译器支持TR1,则可以使用std::tr1::bind

using std::tr1::placeholders::_1;
std::remove_if(vectorB.begin(), vectorB.end(),
               std::tr1::bind(&A::invalidB, some_A, _1));