Problem mit std::find Syntax
-
Hallo Freunde,
kurze Frage zu std::find.
Angenommen ich habe eine einfache Property-Klasse wie unten (Copy-Konstruktor, Zuweisungs-
Operator, etc. spare ich mir der Einfachheit halber). Davon habe ich n Objekte in einem std::vector.
Jetzt die Frage: Wie muss die Syntax für std::find lauten, damit ich mit std::find nur ein Property-Objekt
mit einem bestimmten Namen finde?// ------- Snip: Property.h --------------- #include<string> class Property { private: std::string mName; std::string mValue; public: Property(); ~Property(); inline void setName( const std::string& pName ) { mName = pName; } inline void setValue( const std::string& pValue ) { mValue = pValue; } inline const std::string& getName() const { return mName; } inline const std::string& getValue() const { return mValue; } };
// -------- Snip: main.cpp -------------------- int main( int argc, char* argv[] ) { // Fülle properties mit n Objekten vom Typ Property // Alle Properties haben einen Namen, der unique ist. std::vector<Property> properties; // Das ist sooo syntaktisch bestimmt nicht richtig, aber wie muss die Syntax lauten? std::vector<Property::iterator propertyIterator = std::find( properties.begin(), properties.end(), getName() == "foobar" ); if ( propertyIterator == properties.end() ) { // Mache Sachen, wenn keine Property gefunden wurde } else { // Mache Sachen mit der gefundenen Property. } exit( EXIT_SUCCESS ); }
Gruß
H.-Gerd
-
Hallo,
ohne die Verwendung von boost::lambda oder boost::mpl wäre das einfachste wohl ein kleines Prädikat:struct PropHasName { PropHasName(const std::string& n) : name_(n) {} bool operator()(const Property& p) const { return p.getName() == name_; } private: std::string name_; }; ... // find_if ist die Prädikatvariante von find vector<Property>::iterator propertyIterator = find_if( properties.begin(), properties.end(), PropHasName("foobar") );
exit( EXIT_SUCCESS );
Sowas sollte in einem C++ Programm mit Objekten nicht stehen. exit beendet dein Programm umgehend und zwar insbesondere ohne dabei lokale Objekte zu zerstören (deren Dtoren aufzurufen). Ein return EXIT_SUCCESS ist hier der richtige Weg.
-
Ganz schön umständlich - die Sache mit den Prädikaten.
Nun, was soll's. Hab ein Prädikat eingebaut, läuft!Und normalerweise mache ich immer ein
return exit( EXIT_SUCCESS );
Ist mir hier nur beim Tippen durch die Lappen gegegangen. Trotzdem danke für den freundlichen Hinweis.
Also - recht herzlichen Dank!
H.-Gerd
http://www.brainsandbytes.de, Dortmund, Germany
-
return exit( EXIT_SUCCESS );
LOL. Das ist genauso falsch. Du hast nichts verstanden oder dich verschrieben.
-
So muss es natürlich heißen:
return EXIT_SUCCESS