vector+lookup



  • Hallo zusammen!

    Ich würde gerne in einer eigenen Implementierung der Vectorklasse der STL eine Lookup-Routine einbauen. Also eine Routine, die mir mitteilt ob ein bestimmtes ContentObjekt im Vector enthalten ist.

    Ich hätte zunächst die 'find()'-Routine aus 'algorithm' verwendet, um dieses lookup zu realisieren. Also ungefähr so:

    bool lookup(cType content)
      {
         bool exists=false;
         vector<cType>::iterator iter=find(vector.begin(),vector.end(),content);
         if(iter!=vector.end()) exists=true;
         return(exists);
      }
    

    Nur müsste ich hierfür ja bei allen verwendbaren ContentObjektKlassen den '=='-Operator überladen. Und das ist natürlich schon ziemlich umständlich. Besonders wenn immer wieder neue KLassentypen verwendet werden können!

    Gibt es auch noch irgendeine andere Möglichkeit relativ schnell nach einem Eintrag eines Vectors zu suchen, um so eine 'Lookup'-Routine realisieren zu können?

    Danke!

    Grüße,
    TS++



  • Hm, wieso überschreibst du nicht den Operator== in einer Virtuellen Basisklasse für
    deine content-Objekte ?

    Devil



  • Woher willst du wissen, ob ein Objekt da ist, wenn du nicht vergleicht, ob es das richtige ist?



  • Das würde ja dann ungefähr so aussehen:

    class BaseClass
    {
       public:
       BaseClass(){};
       ~BaseClass(){};
    
       bool operator==(BaseClass anotherObj)
       {
          bool equals=false;
          if(<hier Vergleich> ) equals=true;
          return(equals);
       }   
    
       protected:
       private:
    };
    

    Nur den Code für den Vergleich müsste ich ja für alle möglichen ContentObjektKlassen separat implementieren!
    Oder geht*s auch anders?

    Grüße,
    TS++

    [ Dieser Beitrag wurde am 14.06.2003 um 15:33 Uhr von TS++ editiert. ]



  • Warum immer deine bekloppten temporären Variablen, die keiner braucht?

    bool operator==(BaseClass anotherObj)
       {
          bool equals=false;   // Was soll das hier?
          if(<hier Vergleich> ) equals=true;
          return(equals);
       }
    

    Versuchs mal ohne. eine boll ist jetzt vielleicht nicht besonders zeitaufwendig anzulegen, aber bei anderen Klassen kann das schon mehr reinhauen.

    bool operator==(BaseClass anotherObj)
       {
          if(<hier Vergleich> ) 
             return true;
          return false;
       }
    

    Wenn du lust hast, kannst du auch noch ein else dazwischen schreiben. Das ist Geschmackssache.



  • Soweit das Wort zum Sonntag! 😉
    Ich merk's mir!

    Grüße,
    TS++



  • if(<hier Vergleich> )
    return true;
    return false;

    Ähm, ich würde dann ja doch ein

    return <hier vergleich>;
    

    verwenden 🙂

    Alles andere erinnert so ein bischen an das

    if (x) 
        x = false;
    else
        x = true;
    

    Syndrom 🙂



  • meinst du sowas, hume?

    bool LastIsStar = (*m_Pattern.rbegin() == '*') ? true : false;
    


  • Original erstellt von PeterTheMaster:
    **meinst du sowas, hume?

    bool LastIsStar = (*m_Pattern.rbegin() == '*') ? true : false;
    

    **

    ich denke er meint

    return *Pattern.rbegin()=='*';



  • also diese zeilen sind ja nun wirlich ueberhaupt nicht aequivalent. ich wollte nur sehen, was hume dazu sagt, weil das aus seinem dirstream ist.
    wo ich schon dabei bin, der FileSelector ist buggy. bei *.a sucht der einfach nach dem ersten punkt und haelt deshalb c.b.a fuer nicht passend.



  • @Peter
    Ich meinte genau das, was Shade gesagt hat. Schließlich ist in den Beispielen nirgends ein relevanter Seiteneffekt nötig.

    Und nur weil ich selbst zu dämlich fürs paraktische Programmieren bin, heißt das
    nicht, dass ich nicht *theoretisch* weiß wie man es besser machen kann. Es hilft also nicht und es beweist auch nichts, wenn du schlechten Code von mir postest, da ich nirgends behaupte mein Code wäre qualitativ hochwertig oder ein gutes Beispiel dem man folgenden sollte.
    Achso und natürlich wäre:

    bool LastIsStar = (*m_Pattern.rbegin() == '*');
    

    besser. Und abhängig vom Kontext (den ich jetzt nicht im Kopf habe) würde ich wohl völlig auf die Variable LastIsStar verzichten. Allein schon weil der Name nichts aussagt.

    wo ich schon dabei bin, der FileSelector ist buggy. bei *.a sucht der einfach nach dem ersten punkt und haelt deshalb c.b.a fuer nicht passend.

    Nicht der FileSelector ist buggy sondern die *gesamte* dirstream-Implementation. Aber der Code ist ja offen, du kannst ihn also jederzeit deinen Bedürfnissen anpassen.

    [ Dieser Beitrag wurde am 16.06.2003 um 13:34 Uhr von HumeSikkins editiert. ]



  • In den meisten Fällen passiert ja noch was zwischen dem Vergleich und dem return. Außerdem bin ich schlechter Theoretiker, sondern eher fürs Proaktische. Wenn ich hier im Forum poste, wie theoretisch etwas geht sind immer millionen von schwächen, etc. drin.



  • nur mal so aus interesse:

    geht es nicht wenn man sich mit nem
    map<content, bool> merkt ob es schon in den vector aufgenommen wurde oder nicht!? Man muesste natuerlich bei push auf true setzen und beim rausnehmen wieder auf false.

    gruss



  • Ja, das wäre eine Möglichkeit.
    Nur:
    Ich müsste dann ja wieder für die Map, wenn ich mich recht erinnere, schon wieder eine Vergleichsroutine implementieren, auf Basis derer festgelegt werden kann, wie die ContentObjekte in der sortierten Liste angeordnet werden sollen.
    ==> die Katze steht wieder auf den alten Beinden!

    Grüße,
    TS++

    [ Dieser Beitrag wurde am 16.06.2003 um 15:45 Uhr von TS++ editiert. ]



  • sehe ich das recht, daß du dinge mit == vergleichen willst, ohne nen operator == anzubieten?



  • In den meisten Fällen passiert ja noch was zwischen dem Vergleich und dem return.

    In solchen Fällen mag das was anderes sein, aber um solche Fälle ging es hier nicht. Zumindest sieht mir die Frage (samt Code) nicht danach aus.

    Außerdem bin ich schlechter Theoretiker, sondern eher fürs Proaktische.

    Und das heißt was? Nur weil man eher für das Praktische ist, heißt das ja nicht, dass alles theoretische irrelevant wird. Und nur weil du fürs praktische bist, wird meine Aussage nicht weniger richtig.
    Und das an meiner Aussage ausnahmsweise mal was wahres dran ist sieht man vielleicht daran, dass S. Dewhurst in seinem Buch "C++ Gotchas" in Item 7 hnliches bemerkt.

    Wenn ich hier im Forum poste, wie theoretisch etwas geht sind immer millionen von schwächen, etc. drin.

    Das Gefühl habe ich keinesfalls. Aber wenn dann mal was etwas unglcklich ist, darf man dann nicht mehr darauf hinweisen?



  • @Volkard:
    Ich wollte ja auch einfach nur wissen, ob noch eine andere Möglichkeit besteht festzulegen, wie in einem Vector archivierte ContentObjekte miteinander verglichen werden.( Aber du siehst ja, es läuft mittlerweilen eine ganz andere Diskussion im aktuellen Thread )
    Bei der HashMap von SGI gibt's ja auch die Möglichkeit beim Erzeugen der HashMap explizit den Typen eines Funktionsobjekts anzugeben, das einen überladenen Operator zu Vergleichszwecken enthält.

    Aber offensichtlich hab ich beim 'vector' zusammen mit 'find()' wirklich nur die eine Möglichkeit, in meinen ContentObjektKlassen den "=="-Operator zu überladen.

    Grüße,
    TS++



  • In den meisten Fällen passiert ja noch was zwischen dem Vergleich und dem return.

    In solchen Fällen mag das was anderes sein, aber um solche Fälle ging es hier nicht. Zumindest sieht mir die Frage (samt Code) nicht danach aus.

    Das ist eben die Macht der gewohnheit. Sorry. Ich versuch mich zu bessern.

    Außerdem bin ich schlechter Theoretiker, sondern eher fürs Proaktische.

    Und das heißt was? Nur weil man eher für das Praktische ist, heißt das ja nicht, dass alles theoretische irrelevant wird. Und nur weil du fürs praktische bist, wird meine Aussage nicht weniger richtig.
    Und das an meiner Aussage ausnahmsweise mal was wahres dran ist sieht man vielleicht daran, dass S. Dewhurst in seinem Buch "C++ Gotchas" in Item 7 hnliches bemerkt.

    Also das an deinen Aussagen etwas wahres dran ist ist sicherlich nicht die Ausnahme, sondern eher die Regel (bitte jetzt nicht das Sprichwort zitieren).

    Wenn ich hier im Forum poste, wie theoretisch etwas geht sind immer millionen von schwächen, etc. drin.

    Das Gefühl habe ich keinesfalls. Aber wenn dann mal was etwas unglcklich ist, darf man dann nicht mehr darauf hinweisen?

    Auch wenn es scheinbar nicht so rüberkommmt, lasse ich mich gerne kritisieren. Dafür komme ich doch grade in's Forum. Oh, und danke für die Belobigung.



  • Original erstellt von TS++:
    Aber offensichtlich hab ich beim 'vector' zusammen mit 'find()' wirklich nur die eine Möglichkeit, in meinen ContentObjektKlassen den "=="-Operator zu überladen.

    wenn du meinst...
    also vorher drängt sich ja noch ein find_if nebst prädikat, was ein komparator mit deinem suchobjekt gebunden ist.
    aber über so sachen rede ich nicht gerne.



  • Original erstellt von volkard:
    aber über so sachen rede ich nicht gerne.

    Aber warum denn nicht? Wir sind doch hier unter uns! 😉
    Immer raus damit!

    Grüße,
    TS++

    [ Dieser Beitrag wurde am 18.06.2003 um 08:17 Uhr von TS++ editiert. ]


Anmelden zum Antworten