[英]std::remove_if: Removing all occurences of a pointer from std::vector
[英]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.