remove_if 来自 std::vector 个具有成员函数的共享指针

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

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

我正在使用 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());

I've been trying to use remove_if for this, but the Predicate uses a data member of the object, not the pointer.

什么指针?您将需要使用 lambda,因为不支持传递成员函数指针:

ptiles.erase(std::remove_if(ptiles.begin(), ptiles.end(), [](const auto& value) {
    return value->hasNoRegions();
}), ptiles.end());

请注意,MSVC 2013 对现代 C++ 的支持很差,因此您可能需要编写仿函数而不是 lambda,或者不要在 lambda 中使用 auto