Verwendung von list::remove_if
-
Hallo,
ich habe ein Programm dass eine ziemlich große list mit Werten erzeugt. Zu groß um in den Speicher zu passen. Eine Menge Werte sind im späteren Verlauf allerdings unnötig, deshalb will ich diese abundzu aus der Liste löschen (Leider weiß ich erst zum Löschzeitpunkt welche Werte unnötig sind, deshalb kommt ein vorheriges Aussortieren nicht in Frage).
Da ich mich als Anfänger in der Verwendung der STL üben will, will ich das mit list::remove_if machen und nicht einfach die Liste in einer Schleife durchgehen, um die unnötigen Elemente rauszuwerfen. Ich tue mich allerdings noch etwas schwer damit, wie man die Vergleichsfunktion übergibt. Meiner jetzigen Lösung fehlt Eleganz, da ich eine globale Variable verwenden muss:
static double _i_hate_globals; bool is_smaller_than_max (const datatype& value) { ...vergleicht value mit _i_hate_globals... } static inline void reduce_memusage(std::list<datatype> &liste,const double& max) { _i_hate_globals=max; liste.remove_if(is_smaller_than_max); }Mein Problem ist, dass die Vergleichsfunktion irgendwie an den Vergleichswert kommen muss, ich aber nicht weiß wie. Ich habe es mit einer Klasse versucht:
class is_smaller_than_max { private: double max; public: is_smaller_than_max(double mm):max(mm){} bool check (const datatype& value) { ...vergleicht value mit max... } }; static inline void reduce_memusage(std::list<datatype> &liste,const double& max){ is_smaller_than_max temp(max); liste.remove_if(temp.check); }dabei bekomme ich folgenden Fehler, weiß aber nicht warum:
error: no matching function for call to 'std::list<datatype, std::allocator<datatype> >::remove_if(<unknown type>)' /usr/include/c++/4.0.2/bits/list.tcc:276: note: candidates are: void std::list<_Tp, _Alloc>::remove_if(_Predicate) [with _Predicate = bool (is_smaller_than_max::*)(const datatype&), _Tp = datatype, _Alloc = std::allocator<datatype>]temp.check ist hier doch eine bool-wertige Funktion, warum nimmt der Compiler das nicht an?
Ich es auch mal bind2nd und einem überladenen Operator versucht:
bool operator< (const datatype& value, const double& max) { ...vergleicht value mit max... } static inline void reduce_memusage(std::list<datatype> &liste,const double& max){ liste.remove_if(std::bind2nd(std::less<double>(),max)); }Hier ist der Fehler:
error: no match for call to '(std::binder2nd<std::less<double> >) (std::pair<double, std::pair<point, point> >&)' /usr/include/c++/4.0.2/bits/stl_function.h:439: note: candidates are: typename _Operation::result_type std::binder2nd<_Operation>::operator()(const typename _Operation::first_argument_type&) const [with _Operation = std::less<double>] /usr/include/c++/4.0.2/bits/stl_function.h:445: note: typename _Operation::result_type std::binder2nd<_Operation>::operator()(typename _Operation::first_argument_type&) const [with _Operation = std::less<double>]Es wird also anscheinend der überladene Operator nicht für std::less eingesetzt (habe ich ehrlich gesagt auch nicht erwartet, aber was probiert man nicht alles). Wie macht man das richtig?
Viele Grüße und Danke für Hilfe im Voraus!
-
SeppJ schrieb:
ich habe ein Programm dass eine ziemlich große list mit Werten erzeugt. Zu groß um in den Speicher zu passen. ...
Da ich mich als Anfänger in der Verwendung der STL üben will, will ich das mit list::remove_if machen
Wie sollen die Daten in die liste passen, wenn sie zu groß für den Speicher sind?:schland:
-
functor:
struct IsSmallerThan { private: int max; public: IsSmallerThan(int max) : max(max) { } bool operator()(Data const& value) const { return /*max mit value vergleichen*/; } }; //und dann: liste.remove_if(IsSmallerThan(some_value));
-
????? schrieb:
SeppJ schrieb:
ich habe ein Programm dass eine ziemlich große list mit Werten erzeugt. Zu groß um in den Speicher zu passen. ...
Da ich mich als Anfänger in der Verwendung der STL üben will, will ich das mit list::remove_if machen
Wie sollen die Daten in die liste passen, wenn sie zu groß für den Speicher sind?Die Werte selbst sind jeweils nur ~32 byte, aber es sind ohne das zwischenzeitliche Rauslöschen über 4 Milliarden Werte in der Liste. Für meinen Arbeitsspeicher zu groß und Auslagern ist viel, viel zu langsam.
Shade Of Mine schrieb:
functor:
struct IsSmallerThan { private: int max; public: IsSmallerThan(int max) : max(max) { } bool operator()(Data const& value) const { return /*max mit value vergleichen*/; } }; //und dann: liste.remove_if(IsSmallerThan(some_value));Vielen Dank, das funktioniert! Dann werde ich mich mal näher mit dem Thema "functor" beschäftigen.