使用std :: remove_if作为非指针类型的向量

时间:2017-04-23 15:07:13

标签: c++ vector stl

我有一个对象矢量:

std::vector<QueuedMessage> _messages;

尝试使用erase-remove idiom删除所有对象:

void MessageQueue::removeFromQueue(){
    _messages.erase(std::remove_if(_messages.begin(),_messages.end(),wasMessageSend),_messages.end());
}

我的比较功能:

bool MessageQueue::wasMessageSend(const QueuedMessage& mess){

            return mess.canSendMessage();
        }

比较对象类中的函数:

bool QueuedMessage::canSendMessage() const{
    return (SDL_GetTicks() >= startTick);
}

但是,我收到此错误:

error: must use '.*' or '->*' to call pointer-to-member function in '((__gnu_cxx::__ops::_Iter_pred<bool (MessageQueue::*)(const QueuedMessage&)>*)this)->__gnu_cxx::__ops::_Iter_pred<bool (MessageQueue::*)(const QueuedMessage&)>::_M_pred (...)', e.g. '(... ->* ((__gnu_cxx::__ops::_Iter_pred<bool (MessageQueue::*)(const QueuedMessage&)>*)this)->__gnu_cxx::__ops::_Iter_pred<bool (MessageQueue::*)(const QueuedMessage&)>::_M_pred) (...)'|

我没有使用指针向量是一个问题吗?或者我错过了什么?感谢。

2 个答案:

答案 0 :(得分:3)

传递给std::remove_if的谓词应该是一个带有bool pred(const Type &a);签名的一元谓词。这意味着它将以元素作为参数调用。但是wasMessageSend是一个成员函数,所以除了参数之外,还需要调用一个实例。因此它不能直接与remove_if一起使用。

你可以使用lambda(因为C ++ 11),如:

_messages.erase(std::remove_if(
    _messages.begin(),
    _messages.end(),
    [this](const QueuedMessage& q) {
        return wasMessageSend(q);
    }
));

答案 1 :(得分:1)

由于wasMessageSend是您的班级MessageQueue的成员函数,因此您需要使用this <将其“绑定”到对象(在本例中为std::bind) / p>

void MessageQueue::removeFromQueue(){
_messages.erase(std::remove_if(_messages.begin(),_messages.end(),
    std::bind(&MessageQueue::wasMessageSend, this, std::placeholders::_1), // bind this
    std::_messages.end());
}

当然,这不是唯一的方法,例如你可以在现场定义一个lambda谓词......但是这个方法展示了如何使用成员函数作为谓词。