Suche Map, wobei mehrere Schlüssel auf ein Objekt zeigen und voneinander wissen
-
Hi Leute,
Ich brauch net Map, die nur in eine Richtung eindeutig ist: einem Schlüssel ist genau ein Objekt zugeordnet. Einem Objekt können jedoch mehrere Objekte zugeordnet werden, wobei die Schlüssel voneinander wissen sollen. Wenn ich also mit einem Schlüssel ein Objekt hole, will ich die Möglichkeit haben, mir auch die restlichen, mit diesem Objekt assoziierten, Schlüssel anzeigen lassen können.
Ist sowas bei der stdlib dabei? Wenn nicht, kennt ihr eine Gute?
-
hi dEUs,
ich würde ne neue klasse nehmen welche public von map erbt. dann noch ne weitere map in deine klasse aufnehmen, welche die objekte und ne liste für die schlüssel enthält.
und dann musst du halt noch die funktionen/operatoren zum einfügen/zuweisen überladen (damit halt die zweite map aktualisiert wird und dann die funktion der basisklasse aufrufen).sollte hoffentlich nicht der riesenaufwand werden
-
Sowas wirst in kaum einer Bibo fertig finden ....
weil, das kann man selber bauen. Die Bibos liefern nur die Werkzeuge zu.[quote]einem Schlüssel ist genau ein Objekt zugeordnet[!quote]
Ich nehm mal an, dein Key ist nen POD, also was ganzzahliges oder so ?
Dein objekt ist ne Instanz von ner klasse, von mir aus auch ueber ner abgeleiteteten Klasse ?1. Soll dein Konstrukt die Objekte verwalten, also der Herr uber deren Laufzeit sein ?
wenn ja, dann gib dem Konstrukt funktionen zum erzeugen deiner objecte (siehe auch Fabrikmethoden )
leg deine Objekte in ne std::list, die fuer die verwaltung verantwortlich ist, und deine objekte loescht, wennn das konstrukt zerstoerst.einem Schlüssel ist genau ein Objekt zugeordnet
nun leg ne Std::map an, die dir die Verwaltung key -> Objekt uebernimmt.
Einem Objekt können jedoch mehrere Objekte zugeordnet werden, wobei die Schlüssel voneinander wissen sollen
hier gibts mehrere wege ....
ne liste in ne Map also sowas std::map<int,std::list<int> > natuerlich besser mit typedef, oder noch besser, die lose liste als klasse kapseln ...
oder machst ne Multimap ... da ist das suchen dann etwas umstaendlicher ....insgesamt sowas wie:
typedef unsigned int key_t; typedef MyClass object_t; typedef object_t * pobject_t; class ObjectManager { private; typedef std::list<pobject_t> objectlist_t; typedef std::list<key_t> keylist_t; typedef std::map<key_t,pobject_t> keyobjectmap_t; typedef std::map<key_t,keylist_t> keyrelationmap_t; public; // Konstruktion / destruktion ObjectManager(); virtual ~ObjectManager(); // Object erzeugen key_t CreateObject(/* deine Paramater hier */); // erzeugt das Objekt, kreirt den Key(oder du gibst ihn selber als Parameter mit an ) // Object zugriff const pobject_t get_Object(key_t key); // gibt dir das object zum key // rel pflegen AddRel(key_t key, key_t relKey); // fuegt eine relKey in die liste der beziehungen zu key zu RemoveRel(key_t key, key_t relKey); // Bezihung wird wieder entfernt RemoveObject(key_t key); // loescht nen Objekt mit allen seinen bezihungen ... // usw. zugriff auf elementanzahl, und methoden zum iteriren durch die keybeziehungen fehlen noch private: objectlist_t m_ObjectList; keyobjectmap_t m_KeyObjectmap; keyrelationmap_t m_KeyRelMap; };
Nur so als ansatz, so wuerd ich es machen ....
Brauchst das haeufiger, machs komplett als template !!!
Ciao ....
-
ich würde ne neue klasse nehmen welche public von map erbt
Darueber laesst sich streiten ...
... Erbe nie um code wiederzuverwenden ...
... vererbe nur, um selber weiderverwendet zu werden ....aus exceptional c++ . (editiert)
Ist ok, wenn sich das ganze ding wie ne einfache Map verhalten muss ("ist ein" Beziehung). Und wenn du es mit anderen maps in nen topf werfen willst, was bei stl containern eher nich so der fall ist ....
sollte hoffentlich nicht der riesenaufwand werden
Naja, um ein bisserl arbeit kommt er nicht drumherum. Ist ja schon ziemlich speziell, was er da haben will :p
Ciao ...
-
RHBaum schrieb:
... Erbe nie um code wiederzuverwenden ...
... vererbe nur, um selber weiderverwendet zu werden ....aus modern c++ design.
Sicher? Wenn mich nicht alles täuscht, stammt das ursprünglich aus Herb Sutters "Exceptional C++".
-
Mein ich auch.
-
Ups, asche auf mein haupt !!!
Wie konnt ich nur ..., ja, in der Formulierung stehts in exceptional c++ !Ich hoffe die Authoren verzeihen mir.
Ciao ...
-
RHBaum schrieb:
Ich hoffe die Authoren verzeihen mir.
ich verzeihe diesen anglizismus nicht.
-
Man, macht mich nur alle fertig ... vertippt !
ok, es heisst Autoren !Ciao ...
-
@RHBaum:
Danke für deinen Vorschlag, werde mich heute nachmittag etwas genauer damit auseinander setzen.