2012-03-29 7 views
1

Ich habe einen Objektcontainer, Liste; und Klasse Foo haben eine Member Function ID() gibt eine Integer-Kennung zurück. Jetzt möchte ich STL-Algorithmus remove_if verwenden, um einige Objekte zu entfernen, deren ID kleiner als ein Wert ist. Ich möchte keine Funktion für ID bieten vergleichen, Wenn es mir möglich ist, einen Zeilencode mit STL zu schreiben, aber Boost, um es zu implementieren.stl remove_if mit Klassenglied Funktion Ergebnis

class Foo{ 
public: 
    unsigned id() const {return id_;} 
    ... 
private: 
    unsigned id_ 
    ... 
}; 
list<Foo> foo_list; 
std::remove_if(foo_list.begin(), foo_list.end(), ???); 

Wenn STL dies mit nur std tun können :: bind2nd, stl :: weniger() std :: mem_fun_ref() oder andere stl Funktionen.

+0

Wenn Sie einen modernen Compiler haben, suchen Sie nach [lambdas] (http://en.cppreference.com/w/cpp/language/lambda). –

+0

@Joachim Pileborg Ich benutze vs2005, ohne C++ 11 Unterstützung. –

+0

Nun, Sie sind auf dem richtigen Weg mit diesen 3-stündigen Helfern, aber leider enthält C++ keine SGI Compose-Funktionsadapter. So kommen Sie nicht um Ihren eigenen Funktor herum. Genau aus diesem Grund verbessern die Lambdas von C++ 11 (und verallgemeinerte Binder) die Verwendbarkeit der Standardalgorithmen um ein Vielfaches. –

Antwort

2

Ja, das ist möglich, ohne Lambdas zu erreichen, wenn Sie zustimmen, die Schnittstelle von Foo ein wenig zu ändern.

class Foo 
    { 
public: 
    Foo(unsigned id) 
    : id_(id) {} 
    bool is_equal(unsigned id) const 
    { return id_ == id; } 
private: 
    unsigned id_; 
    }; 

typedef list<Foo> FooList; 

FooList foo_list; 
foo_list.push_back(Foo(1)); 
foo_list.push_back(Foo(2)); 

unsigned to_remove = 1; 
foo_list.remove_if(std::bind2nd(std::mem_fun_ref(&Foo::is_equal), to_remove));