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

    http://www.brainsandbytes.de, Dortmund, Germany



  • 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
    

Anmelden zum Antworten