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() );

現在、与えられている例はどこでも単純な整数用であり、クラス オブジェクト用ではありません。

そのような操作を実行する簡単な方法はありますか?

そして、MSVC 2010 と XCode 4 と 10.6 SDK で動作する必要があります。

:与えられたコードは、私が取り組んでいる実際のコードの簡略化されたバージョンです。クラス 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_iftrue

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

に渡される関数にラムダを使用したことに注意してくださいremove_if。コンパイラがまだそれをサポートしていない場合は、関数を関数として (シグネチャを使用してbool func(const CPlayer&);、または関数オブジェクトとしてbool operator()(const CPlayer&)

于 2013-07-13T08:57:53.350 に答える
0

std::remove_ifラムダ関数を述語として使用するだけです。

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

Lambda は VC10 (VS2010 C++ コンパイラ) でサポートされています。

XCode では Clang を使用していますか? ラムダ式もサポートしています。

一方、コンパイラが C++11 ラムダをサポートしていない場合は、ファンクタが正しい方法です。

于 2013-07-13T08:58:17.550 に答える