c ++从vector中删除自定义对象:std :: remove_if':找不到匹配的重载函数

Sve*_*art 1 c++ vector c++11

在我的项目中有一个向量

 std::vector<std::shared_ptr<MovingEntity>>gameObjects;
Run Code Online (Sandbox Code Playgroud)

如果元素符合标准,我想删除它们.

删除元素的方法:

void GameWorld::catchBees()
{
    auto q = std::remove_if(bees.begin(), bees.end(), beeToClose);
    bees.erase(q);
}
Run Code Online (Sandbox Code Playgroud)

方法beeToClose:

bool GameWorld::beeToClose( const MovingEntity & bee)
{
    std::shared_ptr<Beekeeper> keeper = std::static_pointer_cast<Beekeeper>(m_beekeeper);
    if (bee.getConstPosition().distanceTo(m_beekeeper->getPosition()) > keeper->getCatchDistance())
    {
        return true;
    }

    return false;
}
Run Code Online (Sandbox Code Playgroud)

当我尝试编译代码时,我遇到了一些我试图理解的错误:

'GameWorld :: beeToClose':非标准语法; 使用'&'创建指针

不确定为什么会给出这条消息

'std :: remove_if':找不到匹配的重载函数

我没有声明beeToClose对吗?

'q':在初始化SDLFramework之前无法使用

q未初始化,因为:

std::remove_if(bees.begin(), bees.end(), beeToClose);
Run Code Online (Sandbox Code Playgroud)

运行不对吗?

如何在满足某些条件时正确地从向量中删除std :: shared_ptr?

Pra*_*ian 5

形成指向成员函数的指针的语法是&ClassName::FunctionName.所以你需要&GameWorld::beeToClose一个指向beeToClose成员函数的指针.在您的情况下,您应该使用lambda来调用该函数

auto q = std::remove_if(bees.begin(), bees.end(),
                    [&](shared_ptr<MovingEntity> const& bee){ return beeToClose(bee); });
Run Code Online (Sandbox Code Playgroud)

此外,您正在使用错误的vector::erase重载,您希望删除一系列元素,而不是删除单个元素的元素.

bees.erase(q, bees.end());
Run Code Online (Sandbox Code Playgroud)