Spezielle Map



  • Hallo,
    ich bin im Moment auf der Suche nach einer map (also sowas wie std::map), die nicht nur den Schlüssel dem Wert zuordnen kann, sondern auch andersrum, *und* zusätzlich noch diesem Paar noch ein paar andere Daten speichert. Es sollen also drei Werte pro Element gespeichert werden, nämlich zwei, die man als Schlüssel für die beiden anderen verwenden kann und dann noch ein zusätzlicher. Ich hoffe es war nicht zu kompliziert 😃
    Gegoogelt hab ich schon vergebens, vielleicht hab ich die falschen Suchbegriffe eingegeben. Und ich dachte mir, bevor ich das selber programmiere (das würde wahrscheinlich die schrecklichste Klasse der Welt) frag ich mal hier.
    Ich hoffe, ich hab nichts übersehen beim Internetdurchforsten!
    geloescht



  • Mir viel dar nur std::map<Typ1, std::map<Typ2, Typ3> > ein.

    mfg
    Glamdring



  • da Maps die Values (in aller Regel) so speichern, daß die Keys sehr schnell gefunden werden (durch Tree oder in einer gehashten Table zB), is das mit dem nach Value suchen und den Schlüssel dazu finden so ne Sache.. Effinzient wird das jedenfalls wohl nie sein.

    Du könntest vielleicht ne Klasse schreiben, die 2 Maps, eine mit Key->Value und eine weitere mit Value->Key enthält. Für den Zugriff auf die Map-Einträge wär operator[] in dem Fall wohl nicht geeignet. Daher schreib dir eine Funktion put(key,value) die die Werte in beide Maps jeweils andersrum reintut und dann 2 getter-Funktionen getKeyForValue(value) und getValueForKey(key), die aus der jeweils passenden Map den Eintrag holen.



  • @ Glamdrink
    Ich glaube nicht, dass deine Version das tut was ich will. Vielleicht hab ichs ein bisschen kompliziert erklärt *grinz*

    @Shady

    Hm, ja, das wäre ne Möglichkeit... und was mach ich dann mit dem dritten Wert? Den muss ich auch noch irgendwo speichern. So hab ich wenigstens schonmal ne Map in beide Richtungen!

    Hups... Ich glaub sowas ähnliches gabs schonmal vor nicht allzulanger Zeit! Aber natürlich ohne diesen dritten Wert, und den brauch ich halt auch...

    geloescht



  • Ich bin mir nicht so ganz sicher ob ich das mit dem 3. Wert kapiere 😃

    Du hast also drei Werte: a,b,c:

    dann willst du mit Key a -> b und c finden
    und mit Key b-> a und c finden?

    nennen wir die Typen mal KeyTypeA, KeyTypeB und ParaType

    die internen Maps könnten so aussehen:

    map< KeyTypeA, pair<KeyTypeB, ParaType> > mapA;
    map< KeyTypeB, pair<KeyTypeA, ParaType> > mapB;
    

    die put-Funtkion macht dann something like:

    void put(const KeyTypeA& a, const KeyTypeB& b, const ParaType& p)
    {
      pair<KeyTypeB,ParaType> pairA(b,p);
      mapA[a]=pairA;
      pair<KeyTypeA,ParaType> pairB(a,p);
      mapA[b]=pairB;
    
    }
    

    is jetzt völlig ungetestet

    die getter kriegst du wohl selber hin



  • Jo, so hab ich mir das gedacht! Ich werds dann mal testen. Ich schreib dann in diesen Thread wenns klappt, oder Stolpersteine im Weg liegen!
    Danke!

    geloescht


Anmelden zum Antworten