[英]remove_if from a std::vector of shared pointers with a member function
如何删除满足条件ptile->hasNoRegions()
的std::vector<std::shared_ptr<PTile>> ptiles
的ptile->hasNoRegions()
? 我一直试图为此使用remove_if
,但是Predicate
使用对象的数据成员,而不是指针。 如果元素是指向对象的智能指针,如何将谓词设置为函数?
我现在有什么
ptiles.erase(std::remove_if(ptiles.begin(), ptiles.end(), &PTile::hasNoRegions), ptiles.end());
其中hasNoRegions
是其成员函数PTile
。 这显然不起作用,因为我有一个std::shared_ptr<PTile>
,而不是PTile
。
我正在使用MSVC 2013。
即使向量没有存储指针,这也可能行不通,因为成员函数将this
用作隐式参数,并且不会生成代码。
您需要编写一个显式处理std::shared_ptr
的函子或lambda。
ptiles.erase(
std::remove_if(ptiles.begin(), ptiles.end(), [](std::shared_ptr<PTile> const& ptr) {
return ptr->hasNoRegions();
}),
ptiles.end()
);
或者,如果您没有lambda:
//Outside method
bool should_remove_ptile(std::shared_ptr<PTile> const& ptr) {
return ptr->hasNoRegions();
}
//inside method
ptiles.erase(std::remove_if(ptiles.begin(), ptiles.end(), should_remove_ptile), ptiles.end());
我一直试图为此使用
remove_if
,但是Predicate
使用对象的数据成员,而不是指针。
什么指针? 您将需要使用lambda,因为不支持传递成员函数指针:
ptiles.erase(std::remove_if(ptiles.begin(), ptiles.end(), [](const auto& value) {
return value->hasNoRegions();
}), ptiles.end());
应当注意,MSVC 2013对现代C ++的支持较差,因此您可能需要编写仿函数而不是lambda,或者不要在lambda中使用auto
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.