如何从std :: vector中删除对象?

时间:2013-07-13 08:38:37

标签: vector c++-standard-library

ALL,

请考虑以下代码:

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为真的玩家。

是否可以做这样的事情:

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

现在,所给出的示例都是简单整数而不是类对象。

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

我需要它在MSVC 2010和XCode 4中使用10.6 SDK。

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

谢谢。

P.S。:我找到了this,但我的问题是它是否适用于OSX。我的卸妆器看起来像这样:

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

2 个答案:

答案 0 :(得分: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&)

答案 1 :(得分:0)

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

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

Lambdas are supported by VC10 (VS2010 C++ compiler).

在XCode中你使用的是Clang吗? It supports lambda expressions too.

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