Bags in C++



  • Croatiancow schrieb:

    So wie ich das sehe gibt es keine Methode in Vector welche das macht. Also würde ich eine eigene schreiben.

    Nein!

    Croatiancow schrieb:

    Tja und hier komm ich nicht weiter. Vector ist ja aus der STL und da soll man nicht direkt davon ableiten.

    Ja, weil die Vererbung im Normalfall auch nicht nötig ist.

    Croatiancow schrieb:

    Wie krieg ich das aber hin eine eigene Klasse zu schreiben welche mir eingentlich nur ein Vector + meine eigenen Methoden zur verfügung stellt?

    Gar nicht.

    Ich habe das Gefühl, du denkst zu fest an andere Programmiersprachen, wo deine Vorgehensweise möglicherweise üblich ist. In C++ gibt es allerdings freie Funktionen, welche unabhängig von Klassen arbeiten können. Folglich brauchst du die Funktionen nicht als Member zu implementieren, sondern -- wenn überhaupt -- global.

    Eine Möglichkeit zum Suchen gibt es in der STL jedoch bereits: Siehe dazu den Algorithmus std::find() auf www.cplusplus.com.

    Croatiancow schrieb:

    Verzeiht mir meine Unwissenheit.

    Du brauchst dich doch nicht rechtzufertigen, wir helfen gerne. 🙂



  • Nein ich habe in meinem Leben weder Java noch C# oder sonstwas gemacht. Nur C++

    Es ging mir darum ein Bag zu erstellen und den dann mit Methoden zu erweitern. Einfach mal was global zu definieren ist leider nicht OO und somit für mich uninteressant. Ich darf nur mit Objekten arbeiten.

    Also ist ein

    Bag.includes(Objekt)
    

    so nicht möglich. Klar das ich mit

    p = find(vectorObject.begin(), vectorObject.end(), Objekt);
    

    suchen kann.

    Schön wäre ein

    Bag.find(vectorObject.begin(), vectorObject.end(), Objekt);
    

    Gruß



  • Croatiancow schrieb:

    Einfach mal was global zu definieren ist leider nicht OO

    Du meinst, es entspricht nicht deiner Definition von Objektorientierung. 😉

    Croatiancow schrieb:

    Ich darf nur mit Objekten arbeiten.

    Okay. Dann schreibe dir eine Bag-Klasse, die aber nicht von std::vector erbt, sondern ihn als Membervariable enthält (Aggregation). Somit brauchst du auch nicht alle Methoden anzubieten, sondern kannst das Interface auf die beschränken, die du brauchst. Entsprechend bietest du eine find() -, contains() oder includes() -Memberfunktion an, welche die gewünschte Funktionalität bietet. Intern verwendet sie std::find() .



  • Genau das mache ich jetzt 🙂

    Ist mir beim Brainstorming mit nem Kumpel gekommen 🙂

    Ich Danke euch vielmals! Ihr seid echt Klasse!



  • das heißt bug



  • ccc schrieb:

    das heißt bug

    Das les ich eben auch immer, wenn ich die Thread Liste überfliege.. :p


  • Mod

    hustbaer schrieb:

    Mit Standard C++ kannst du void* nicht ordnen, da Zeigervergleich undefiniert ist, wenn die Zeiger nicht aus dem selben Array kommen.

    Nach der Logik könnten Zeiger niemals als Keys eines assoziativen Containers auftreten. Diese Einschränkung gilt erfahrungsgemäß nicht.
    Denn std::less ist sehr wohl definiert für beliebige gültige Zeigerpaare (20.3.3/8).



  • camper schrieb:

    hustbaer schrieb:

    Mit Standard C++ kannst du void* nicht ordnen, da Zeigervergleich undefiniert ist, wenn die Zeiger nicht aus dem selben Array kommen.

    Nach der Logik könnten Zeiger niemals als Keys eines assoziativen Containers auftreten. Diese Einschränkung gilt erfahrungsgemäß nicht.
    Denn std::less ist sehr wohl definiert für beliebige gültige Zeigerpaare (20.3.3/8).

    Cool, wusste ich nicht.

    Bringt aber eigentlich nix in dem Fall. boost::any ist ein "value type", d.h. die Adresse des "inneren T" würde sich mit Zuweisung/Kopie ändern. D.h. weiter, ein set.find(v) würde nie was finden. Kann man also gleich std::list nehmen.

    p.S.: oder vielleicht ein std::set<boost::shared_ptr<boost::any> > 😃



  • Das mit es mit find() nicht funktioniert musste ich leider feststellen.

    Mein Workaround hierzu ist eine häßliche schleife:

    bool Beutel::includes(SFR sfrgeld){
    
         for(int x=0;x<geldbeutel.size();x++)
        {
    
        if ((geldbeutel[x].type() == typeid(SFR))&&((sfrgeld.getValue() == (boost::any_cast<SFR>(geldbeutel[x]).getValue()))))
            {
            return true;
            }
    
         };
    return false;
     };
    

    Gibts da echt keine andere Möglichkeit?



  • Dem STL-Algorithmus std::find_if() kannst du eine Vergleichsfunktion übergeben. Aber der Code wird dadurch gesamthaft nicht kürzer, nur deine includes() -Funktion sieht schöner aus.


Anmelden zum Antworten