繁体   English   中英

使用成员函数从共享指针的std :: vector中删除_if

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

如何删除满足条件ptile->hasNoRegions()std::vector<std::shared_ptr<PTile>> ptilesptile->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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM