[solved] STL-algorithm-Funktionen bei STL-Listen mit Zeigern auf Objekte
-
Hallo miteinander,
ich hab in einem Programm mehrere STL-Listen in denen ich Zeiger auf Objekte verschiedener Klassen verwalte. z.B.
std::list<Klasse1 *> klasse1Liste; std::list<Klasse2 *> klasse2Liste;In all diesen Klassen habe ich den Operator 'operator ==' überladen damit er ein Objekt mit einem int vergleichen kann (d.h. alle Objekte haben einen int-Schlüssel).
Ich möchte nun in den Listen nach einem bestimmten Schlüssel suchen. Dazu möchte ich die STL-algorithm Funktionen verwenden.
Wenn ich mit z.B.
iter = std::find(klass1Liste.begin(), klass1Liste.end(), iKey);arbeite funktioniert es nicht, da in der List ja nur Zeiger auf die Objekte stehen.
Die zweite Variante von 'find', in der ich eine Vergleichsfunktion übergeben kann, akzeptiert nur einen parameter (oder???
). z.Bbool compare(Klasse1 *k1) { return *k1==iKey; }iter = std::find(klasse1Liste.begin(), klasse1Liste.end(), compare);ich müsste also iKey als globale Variable anlegen (oder?
). Außerdem müsste ich für jede Klasse eine separate compare-Funktion schreiben, obwohl die derefferenzierung des Zeigers jedes mal die gleiche ist. Wenn ich nämlich folgende Vorlagen-Funktion erzeuge,template<class T> bool compare(T k1) { return *k1 == iKey; }bekomme ich eine Fehlermeldungen der Art
c:\shapefcts.cpp(122) : error C2896: "_FwdIt1 std::find_first_of(_FwdIt1,_FwdIt1,_FwdIt2,_FwdIt2,_Pr)": Funktions-template "bool match(T,int)" kann nicht als Funktionsargument verwendet werden.
c:\shapefcts.cpp(21): Siehe Deklaration von 'match'
c:\shapefcts.cpp(122) : error C2784: "_FwdIt1 std::find_first_of(_FwdIt1,_FwdIt1,_FwdIt2,_FwdIt2,_Pr)": template-Argument für "_FwdIt2" konnte nicht von "std::list<_Ty>::_Iterator<_Secure_validation>" hergeleitet werden.
with
[
_Ty=int,
_Secure_validation=true
]
c:\programme\microsoft visual studio 8\vc\include\algorithm(578): Siehe Deklaration von 'std::find_first_of'
c:\shapefcts.cpp(122) : error C2780: '_FwdIt1 std::find_first_of(_FwdIt1,_FwdIt1,_FwdIt2,_FwdIt2)': Erwartet 4 Argumente - 5 unterstützt
c:\programme\microsoft visual studio 8\vc\include\algorithm(549): Siehe Deklaration von 'std::find_first_of'Habe es, wie aus der Fehlermeldung ersichtlich, auch mit 'find_first_of' probiert um die globale Variable los zu werden. Dann bleibt aber immer noch, dass ich für jede Klasse eine separate compare-Funktion schreiben muss.
Hat jemand eine Idee oder einen Hinweis, wie dies 'sauber' zu lösen geht?
Herzlichen Dank im Voraus, für jegliche Hilfestellung.
Viele Grüße
Knecht
-
struct compare { compare( int key ) : key( key ) {} bool operator()( Klasse1* k1 ) { return *k1 == key; } int key; } iter = std::find(klasse1Liste.begin(), klasse1Liste.end(), compare( 10));Sowas nennt sich functor
-
Danke für die schnelle Hilfe. Bin leider trotzdem noch nicht auf des Rätsels Lösung gekommen, den wenn ich es wie von User-- vorgeschlagen mache bekomme ich folgende Fehlermeldung
c:\programme\microsoft visual studio 8\vc\include\algorithm(40) : error C2679: Binärer Operator '==': Es konnte kein Operator gefunden werden, der einen rechtsseitigen Operanden vom Typ 'const compare' akzeptiert (oder keine geeignete Konvertierung möglich)
kann 'eingebauter C++ Operator==(Math::Lagrange *, Math::Lagrange *)' sein
c:\lagrange.h(27): oder "bool Math::operator ==(const Math::Lagrange &,const Math::Lagrange &)" [bei argumentbezogenem Lookup gefunden]
c:\lagrange.h(28): oder "bool Math::operator ==(int,const Math::Lagrange &)" [bei argumentbezogenem Lookup gefunden]
c:\quadratur.h(23): oder "bool Math::operator ==(const Math::quadrature &,const Math::quadrature &)" [bei argumentbezogenem Lookup gefunden]
c:\quadratur.h(24): oder "bool Math::operator ==(int,const Math::quadrature &)" [bei argumentbezogenem Lookup gefunden]
c:\quadratur.h(25): oder "bool Math::operator ==(const Math::quadrature &,int)" [bei argumentbezogenem Lookup gefunden]
bei Anpassung der Argumentliste '(Math::Lagrange *, const compare)'
c:\programme\microsoft visual studio 8\vc\include\algorithm(74): Siehe Verweis auf die Instanziierung der gerade kompilierten Funktions-template "_InIt std::_Find<std::list<_Ty>::_Iterator<_Secure_validation>,compare>(_InIt,_InIt,const compare &)".
with
[
_InIt=std::list<Math::Lagrange *>::_Iterator<false>,
_Ty=Math::Lagrange *,
_Secure_validation=false
]
c:\shapefcts.cpp(90): Siehe Verweis auf die Instanziierung der gerade kompilierten Funktions-template "_InIt std::find<std::list<_Ty>::_Iterator<_Secure_validation>,compare>(_InIt,_InIt,const compare &)".
with
[
_InIt=std::list<Math::Lagrange *>::_Iterator<true>,
_Ty=Math::Lagrange *,
_Secure_validation=true
]D.h. mein Compiler verwendet die erste Version von find obwohl er eigentlich die zweite verwenden sollte.
Was habe ich übersehen? Wie bekomme ich meinen Kompiler dazu die zweite Version zu verwenden?Nochmals herzlichen Dank.
Viele Grüße
Knecht
-
Es gibt nur eine Variante von find. Die andere heisst find_if.
-
LordJaxom schrieb:
Es gibt nur eine Variante von find. Die andere heisst find_if.
Sorry!!!
Natürlich musse es find_if heißen.Herzlichen Dank nochmal
Viele Grüße
Knecht