Seasons.NET

ちょっとした技術ブログです

remove_ifで一気に消す

ベクタの要素を消すときにremove_ifで一致するものを消したくなります。
そんな時は関数オブジェクトを用意して、remove_ifを呼んで消すと便利です。

class Hoge
{
private:
    int life_;
public:
    Hoge(int life) : life_(life)
    {
    }
    int GetLife( void ) const
    {
        return life_;
    }
};
class HogeDeleter
{
public:
    bool operator()(const Hoge& h)
    {
        return h.GetLife()==0;
    }
};
BOOST_AUTO_TEST_CASE( vectortest1 )
{
    using namespace boost::assign;
    std::vector<Hoge> v;
    v += Hoge(1),Hoge(0),Hoge(0),Hoge(3);

    std::vector<Hoge>::iterator e = std::remove_if(v.begin(), v.end(), HogeDeleter() );
    v.erase(e,v.end());

    foreach( Hoge& h , v )
    {
        cout << h.GetLife() << endl;
    }
    BOOST_CHECK_EQUAL( v.size() , 2 );
}