Problem mit Suche in Listen
-
Hallo Forum,
folgendes Problem:
#include <list> #include <iostream> #include <algorithm> class MyClass { private: int i; //... public: int get_i() {return i;} void set_i(int n) {i = n;} MyClass(int n) : i(n) {} }; typedef std::list<MyClass> MyList; int main() { MyList ml; ml.push_back(MyClass(3)); ml.push_back(MyClass(7)); ml.push_back(MyClass(4)); }wie lässt sich die Liste nun nach
MyClass::idurchsuchen?
-
//hier mal wie man jegliche MyClass ausgibt for(int i = 0;i<ml.size();i++) { std::cout<<ml[i].get_i()<<std::endl; }ISt deine Frage damit geklärt? Weil ich denke es ging dir um den Zugriff oder irre ich mich?
-
danke

das ist zwar ein Ansatz für Vektoren aber das schaff ich gerade noch, das einer liste beizubringen.
-
Ahh stimmt, ich vergass das std::list ja gar keinen operator[] hat.Du könntest es ja auch über iteratoren machen.
-
Prozeduraler Ansatz: Ist anzuraten, falls du die Suche nicht oft wiederverwendest. Halt ganz typisch in einer Schleife suchen. Je nach Anforderung einen Iterator auf das erste Element zurückgeben oder gleich für alle gleichen Elemente etwas tun.
for (MyList::iterator iter = m1.begin(); iter != m1.end(); ++iter) { if (iter->get_i() == 45) { return iter; // erstes Vorkommen zurückgeben } }Funktionaler Ansatz: Wenn die Klassen gleich sind, sofern deren
is gleich sind, kannst du den Gleichheitsoperator überladen. Allerdings würde ich das vor allem tun, wenn ich sonst noch irgendwo auf Gleichheit prüfen muss. Ich habe hier mal eine Möglichkeit der Standardbibliothek aufgelistet, Boost.Lambda wäre je nachdem eine Alternative.bool operator== (const MyClass& Left, const MyClass& Right) { return Left.get_i() == Right.get_i(); } // .. bei der Anwendung: return std::find(m1.begin(), m1.end(), 45); // impliziert nicht expliziten Konstruktor ;)Falls es dir nicht um eine eigentliche Suche (Lokalisierung des ersten Vorkommens), sondern um eine Anwendung geht, die für alle übereinstimmenden Werte etwas Bestimmtes tun soll, ist vielleicht
std::for_each()besser geeignet.