std::list / find();
-
nabend,
ich habe ein Problem mit list und der funktion find. Und zwar befinden sich in dieser Liste Objekte. Nun möchte ich ein Objekt mit einer eigenschaft finden, die ich nur mittels Objekt.getXY(); bekommen kann. Kann ich find folgendermaßen benutzen?
find(begin(), end(), tempobjekt.getXY() == "Kriterium");
Wenn ja, wie komme ich an so ein Temporäres Objekt?
-
Du brauchst ein Funktor
-
lambda. schrieb:
Du brauchst ein Funktor
Kannst du das genauer erklären?
-
struct mein_vergl_ftor { bool operator()(const mein_obj& obj,const std::string& kr) { return obj.getX()==kr; }; };
Den musst du als zus. Parameter übergeben. Bin mir aber nicht sicher, ob das Vergleichsobjekt ein templateparameter ist...
-
ness schrieb:
struct mein_vergl_ftor { bool operator()(const mein_obj& obj,const std::string& kr) { return obj.getX()==kr; }; };
Den musst du als zus. Parameter übergeben. Bin mir aber nicht sicher, ob das Vergleichsobjekt ein templateparameter ist...
ok. EinVergleichsoperator. Wie setz ich den denn dann ein? Ich bin ein wenig ratlos.
-
kennste google?
-
Ich verstehe halt nur nicht, wie ich das in find(); einbaue. Google hilft mir irgendwie nicht. Ich such wohl nach dem falschen
-
find(begin(), end(), mein_vergl_ftor);
oder
find(begin(), end(), mein_vergl_ftor());
ich weiß nicht genau was richtig ist
-
looooooooool schrieb:
find(begin(), end(), mein_vergl_ftor);
oder
find(begin(), end(), mein_vergl_ftor());
ich weiß nicht genau was richtig ist
looool, ohne parameter?
-
entschuldigung
denke mal so:
struct mein_vergl_ftor { mein_vergl_ftor(const std::string& kr) : kr_(kr) { } bool operator()(const mein_obj& obj) { return obj.getX() == kr_; }; private: std::string kr_; }; find(begin(), end(), mein_vergl_ftor("TGGC"));
-
struct mein_vergl_ftor { mein_vergl_ftor( const std::string& kr ) : kr_(kr) { } bool operator()(const mein_obj& obj) const { return obj.getX()==kr_; } std::string kr_; }; // ... find(begin(), end(), mein_vergl_ftor("Kriterium"));
-
Ja. Du übergibst find eine Funktion, dem find 2 Objekte übergibt, und diese funktion sagt dann, ob diese gleich sind. Nun sollte man das Prinzip des Funktors verstehen:
Man schreibe eine Klasse, die einen überladenen operator() hat, erzeuge eine Instanz davon, und schreibe instanz(parameter). Keiner weiß, ob das ein Funktor, eine Funktion oder sonst was ist. In diesem fall erwartet der Konstruktor keine Parameter, als klasse(). Das schöne ist, dass der Funktor komplett verschwindet:
der aufruf ist inline, der compiler stellt fest, dass das Objekt nicht benutz wird, und sollte es wgoptimieren (so stell ich mir das wenigstens vor...). Das ist der Vorteil gegenüber Funktionszeigern (in diesem Fall): man kann Funktoren inlinen...
/edit: das von finix könnte auch richtig sein, hab jetzt nicht nachgeschlagen...
-
konstuktor braucht man
-
Ich danke für die Antworten. Was ich aber nicht verstehe: Wo kommt das Temporäre in find(begin(), end(), mein_vergl_ftor("...")); her?
-
aus der STL
-
Also ich meine das Temporäre Objekt, mit dem ich vergleiche
-
Die Frage ist unverständlich. Du erstellst das temporäre Objekt doch mit mein_vergl_ftor("...").
-
und find erstellt ein temporäres objekt um es an operator () zu übergeben
mein_vergl_ftor("...")("___")
-
hä? schrieb:
und find erstellt ein temporäres objekt um es an operator () zu übergeben
mein_vergl_ftor("...")("___")
danke, jetzt hab ichs verstanden.
-
find ist hier std:
:find oder std::find aus <algorithm>?
-
algorithm