STL Vektor/List durchsuchen



  • Ahhh ok 🤡

    Also was Du mit "Auf Attributen zugreifen" meinst weiß ich nicht.
    Das suchen des Vectors wird doch eh ausserhlab der KLase gemacht, wo das Problem mit private das gleiche ist. Du brauchst eine Methode zum zugreifen.

    Zu find_if:

    find_if erwartet eine Funktion die true zurück gibt wenn das suchkriterium erfüllt ist. Übergeben bekommt diese Funktion T & (oder wars const T & ? sry ka).

    Das nennt sich prädikat (als Begriff für die Suche).

    Da wir ja nun aber nicht für jeden suchwert eine eigene Funktion schreiben wollen habe ich ein Funktionsobjekt geschrieben das den Suchwert im Konstruktor übergeben bekommt.

    find_if ruft die Funktion auf die man übergibt. In unserem Falle wäre dafür dann der operator() zuständig, der Object & übergeben bekommt. An der Stelle können wir dann vergleichen ob unser Suchbegriff den wir im Konstruktor übergeben haben auf das Objekt passt.

    Das ganze vin unary_function abgeleitet weil find_if ein paar sachen voraussetzt die unary_function mit sich bringt.

    Hm, sry, im erklären bin ich nich gut O🤡



  • 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