1

全部,

考虑以下代码:

class CPlayer
{
public:
    CPlayer(bool new) { m_new = new; };
    bool IsNewPlayer() { return m_new; }
private:
    bool m_new;
};

int main()
{
    std::vector<CPlayer> players_pool;
    players_pool.push_back( false );
    players_pool.push_back( false );
    players_pool.push_back( true );
    players_pool.push_back( false );
}

现在我正在寻找的是删除 m_new 为 true 的玩家。

是否有可能做这样的事情:

players_pool.erase( std::remove( players_pool.begin(), players_pool.end(), players_pool.at().IsNewPlayer() ), players_pool.end() );

现在到处给出的例子都是针对简单整数的,而不是针对类对象的。

有没有一种简单的方法来执行这样的操作?

我需要它在带有 10.6 SDK 的 MSVC 2010 和 XCode 4 中工作。

注意:给出的代码是我正在处理的实际代码的简化版本。CPlayer 类的字段比我放在这里的要多得多,但它们与这篇文章无关。

谢谢你。

PS:我发现了这个,但我的问题是它是否可以在 OSX 上运行。我的卸妆油看起来像这样:

struct Remover : public std::binary_function<CPlayer,void,bool>
{
public:
    bool operator()(const CPlayer &player) const
    {
        return player.IsNewPlayer();
    }
};
4

2 回答 2

1

对的,这是可能的。标准库提供std::remove,它删除等于某个指定值(使用==运算符)的对象,并且它具有std::remove_if,而不是值,它接受一个在对象上调用的函数,如果它返回true,则表明该对象应被删除。因此,只需编写一个定义您想要的条件的函数,然后使用它:

players_pool.erase( std::remove_if(
  players_pool.begin(),
  players_pool.end(),
 [](const CPlayer& p){ return p.IsNewPlayer(); }),
 players_pool.end() );

请注意,我对传递给的函数使用了 lambda remove_if。如果您的编译器还不支持,您可以简单地将函数单独定义为函数(带有签名bool func(const CPlayer&);,或者带有bool operator()(const CPlayer&)

于 2013-07-13T08:57:53.350 回答
0

只需使用std::remove_if和 lambda 函数作为谓词:

players.erase( std::remove_if( players.begin() , 
                               players.end() , 
                               [](const Player& player) { return player.IsNewPlayer(); } 
                              ) );

VC10(VS2010 C++ 编译器)支持 Lambda。

在 XCode 中,您使用的是 Clang?它也支持 lambda 表达式。

另一方面,如果您的编译器不支持 C++11 lambda,那么您的仿函数是正确的方法。

于 2013-07-13T08:58:17.550 回答