STL Vektor/List durchsuchen



  • hat das was mit Funktionsobjekten zu tun?

    Jup

    thomas123 schrieb:

    Bis jetzt habe ich immer Vektoren / Listen mit dieser for-schleife durchsucht und dann, falls Objekte einer Klassenhierarchie im Container waren, einen Dynamic Cast angewendet um ein bestimmtes Objekt abzufragen...

    Hm, mir ist es egal was Du bist, Du musst in die Kiste. Und dann: Such mir mal X aus der Kiste (such wühl vergleich, frag bist Du X ?)

    Wie wärs da mit virtual ? Was meinst Du mit "bestimmtes Objekt abzufragen" ?



  • Na mit bestimmten Objekt meine Ich, das ja in einen Objekt Vektor auch abgeleitetet Objekte vorhanden sein können, die Attribute haben, die ein Objekt der Basisklasse nicht hat.

    Wie kann ich dann den Vektor mit find_if durchsuchen, wenn nicht alle Objekte im Vektor das gesuchte Attribut haben?

    Sonst habe ich das mit dynamic_cast gemacht, um einen zeiger auf das zu durchsuchenede Objekt zu bekommen...



  • Erscheint mir irgendwie ein Designfehler zu sein.

    Wenn ich nen Vector auf die Basisklasse hab ist an der stelle doch nurnoch die Basisklasse interesannt. Dann nach nem Apfel in der Obstkiste zu suchen in der auch Birnenn und Bananen sind erscheint mir etwas ... Naja, merkwürdig 🤡

    Zumindest beim Programmieren 😉

    Du kannst im Prädikat das reinschreiben was Du sonst in der for(;;) stehen hattest. d.h. den Dynamic_cast die Prüfung etc. Aber vllt. kommst Du auf eine insgesammt bessere Lösung wenn Du noch mal das Design überdenkst ?!

    Ka kenn den gesammtramen nicht.



  • eine zumindest einfach Möglichkeit das Attribut zu überprüfen ist indem Du der Basisklasse eine virtuelle Funktion für die Abfrage zur Verfügung stellst. Damit kann da jeder zurückgeben was er will. Allerdings ist das auch nicht die schönste Lösung, weil nicht jeder das Attribut hat. Wenn's aber nicht gerade größere Mengen an Attributen sind, dann ist sowas durchaus vertretbar.

    MfG Jester



  • Aber kann es sein das find_if abbricht, sobald es einen Wert findet, das dem Suchkriteritum entspricht? also falls 2 werte da sind, die der Suche entsprechen, nur den ersten gefundenen ausgibt?



  • Jop das siehst Du richtig. Was sollte die Routine denn sonst auch tun ?

    Tip: Du bekommst einen iterator zurück den Du als begin bei einem zweiten durchlauf übergeben kannst.

    Beschreib mal was Du im Detail vorhast vllt. gibts ne bessere Lösung insgesammt für da schleifenproblem.



  • Knuddlbaer schrieb:

    Jop das siehst Du richtig. Was sollte die Routine denn sonst auch tun ?

    Tip: Du bekommst einen iterator zurück den Du als begin bei einem zweiten durchlauf übergeben kannst.

    Beschreib mal was Du im Detail vorhast vllt. gibts ne bessere Lösung insgesammt für da schleifenproblem.

    Na dann ist der Algorithmus "find_if" doch ziemlich sinnlos, wenn ich eine Menge durchsuchen will, die mehrere Objekte enthält, die dem Suchkriteritum entsprechen?!

    Oder kann ich das irgendwie Schleifen? 🤡



  • Ich persönlich finde das gesammte Unsinnig überhaupt erst ne schleife zu brauchen die einem aus den Basiselementen ein bestimmtes Objekt sucht.

    Da is das Design einfach etwas durcheinander.

    Du kannst:

    a. es so machen wie Du es immer gemacht hast
    b. um das find_if ne schleife legen (was aber irgendwie Käse ist)

    find_if ist sehr genial, aber was Du vorhast:
    Alle Objekte finden die nicht Basis sind sondern X : Basis oder Y : Basis

    Du könntest Übrigens noch for_each verenden und dem ein Prädikat geben der Deine Arbeit erledigt 💡



  • Oder auch ein copy_if implementieren und das verwenden (ich gehe davon aus, daß es sich um einen Container aus Zeigern handelt)



  • Jo hab ich auch drann gedacht...

    Vorteil wäre das man nur das Objekt indentifizieren muss und kann dann knadenlos darauf zugreifen. Aber irgendwie stört mich das man dann die Bananen aus der Obstkiste rausfischen muss weil man keine Äpfel im Obstsalat haben mag 🤡


Anmelden zum Antworten