从具有成员函数的共享指针的std ::向量中remove_if

remove_if from a std::vector of shared pointers with a member function

本文关键字:向量 remove if std 指针 成员 函数 共享      更新时间:2023-10-16

如何删除 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());

其中hasNoRegionsPTile的成员函数。由于我有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