繁体   English   中英

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

[英]Using a std::remove_if for vector of non-pointer types

我有一个对象向量:

std::vector<QueuedMessage> _messages;

并尝试使用擦除删除惯用语删除所有对象:

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) (...)'|

我不使用指针向量是否有问题? 还是我错过了什么? 谢谢。

传递给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);
    }
));

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

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谓词……但是这种方法显示了如何将成员函数用作谓词。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM