Functor und Algorithmus Problem
-
Hallo,
ich zeig euch am besten ein Codebeispiel, damit vesteht man es am einfachsten:struct Dummy { enum state_t { good, bad, } state; state_t get_state() const { return state; } }; // so, nun hab ich hier eine liste an dummy zeigern std::list<Dummy*> tmp; // und will diese sortieren nach gut und schlecht sort(tmp.begin(), tmp.end(), mem_fun(&Dummy::get_state) == Dummy::good);
So wie hier funktioniert es nicht!
Natuerlich koennte ich einfach ein passendes Funktionsobjekt schreiben -> aber genau das will ich nicht. Ich weiss leider nicht, ob ich das Problem mit STL Bordmitteln loesen kann, z.B. mit equal_to oder so.., aber das hab ich nicht hinbekommen, auch mit der boost lambda library hatte ich kein Glueck.
Eventuell kennt sich da jemand von euch besser mit aus ...Vielen Dank.
-
Du brauchst auf die eine oder andere Art und Weise ein Funktionsobjekt, dass zwei Dummies vergleicht. Die einfachste Methode wäre, den operator< zu überladen, den benutzt sort nämlich per default. Allerdings weiß ich nicht, ob sich das in diesem Fall wirklich sinnvoll machen lässt - die andere Methode wäre, ein Funktionsobjekt zu erstellen, dass den Vergleich übernimmt. Ich sehe dabei folgende Möglichkeiten (Dummy definiert wie bei dir):
1. operator< überladen
bool operator<(Dummy const &d, Dummy const &e) { return d.get_state() == Dummy::good; } // ... std::list<Dummy> tmp; sort(tmp.begin(), tmp.end());
2. Funktionsobjekt explizit definieren:
bool compare_dummies(Dummy const &d, Dummy const &e) { return d.get_state() == Dummy::good; } // ... std::list<Dummy> tmp; sort(tmp.begin(), tmp.end(), &compare_dummies);
3. Wenns mit pointern sein muss,
bool compare_dummy_ptrs(Dummy const *d, Dummy const *e) { return d->get_state() == Dummy::good; } // ... std::list<Dummy*> tmp; sort(tmp.begin(), tmp.end(), &compare_dummy_ptrs);
Für ne boost::lambda-Lösung müsste ich grad nachkucken, das geht aber sicher auch.