如何删除 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
。
我正在使用MSVC2013。
即使向量不存储指针,这也可能无法工作,因为成员函数以 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()
);
替代方案,如果您没有lambdas:
//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
。