vector und map Zusammenarbeit
-
Hallo,
ich habe in meinem Programm einen vector<X> (X ist eine eigene Klasse von mir).
Nun brauche ich noch eine map, deren values die X-Objekte aus dem vector sind bzw. auf diese zeigt.
Aus dem vector werden Elemente gelöscht, es werden neue hinzugefügt und bestehende geändert. Außerdem muss es möglich sein, vector und map in einer Datei zu speichern und wieder auszulesen.
Die Frage ist, wie ich diese Map am besten anlege.vector-iterator oder Pointer als value:
Löschen/Hinzufügen macht Iterator und Pointer ungültig.vector-index als value:
Löschen verschiebt den Index der Objekte.X-Objekte als value:
Ich habe keine Möglichkeit, die Änderung eines Objekts aus dem vector in die map zu übernehmen.
-
Also dass nur ein Container die Objekte besitzen kann, sollte ja klar sein. Aber warum brauchst du einmal nen vector und einmal ne map?
-
Es geht um eine GUI.
In einem Tab erstellt man eine Liste (der vector) und in einem anderen kann man jedem Datum ein Listenelement zuordnen.
-
Wurstinator schrieb:
Es geht um eine GUI.
In einem Tab erstellt man eine Liste (der vector) und in einem anderen kann man jedem Datum ein Listenelement zuordnen.Dann nimm ein
std::listanstatt einesstd::vector. Da bleiben die Iteratoren dann gültig. Allerdings ist das eher die Holzhammermethode. Ansonsten könnest Da, wo die Listenelemente zugeordnet werden, einen Observer auf die Liste benutzen. Dann würde sich auch das Problem gelöschter Elemente von selbst erledigen.
-
Was passiert, wenn man ein Element aus der Liste löscht nachdem man das Datum zugeordnet hat?
-
Zum Serialisieren kannst du
boost::serializationverwenden.
Unterstützt ja auch Container, nicht, Tachyon
Edit: Tachyons Editierungen nich' gesehen.
-
Sone schrieb:
Zum Serialisieren kannst du
boost::serializationverwenden.
Unterstützt ja auch Container, nicht, Tachyon
Versteh' ich gerade nicht. Also nicht, dass man mit
boost::serializationContainer serialisieren kann, sondern, wieso Du mich ansprichst.
-
-
Sone schrieb:
Tachyon schrieb:
wieso Du mich ansprichst.
Man, ihr habt alle so ein miserables Gedächtnis.

War das nicht eigentlich Hacker, der den Thread eröffnet hatte? Bist Du Hacker?
-
@ Tachyon:
Hm, ich hatte bisher immer nur ein Signal, dass gesendet wird, sobald sich der vector ändert. Wenn ich das aufteile und je nachdem, ob ein Element gelöscht oder hinzugefügt wurde, verschiedene Signale schicke, müssten Indexe als values funktionieren. Oder übersehe ich was?@ pyhax: Dann sollte das Map-Element gelöscht oder so behandelt werden, als wäre hätte es den default-Wert.
@ Sone: Danke für den Vorschlag, aber ich arbeite mit Qt. Die Klassen dort bringen schon eine Serialization mit sich. Nur Pointer/Iteratoren sind das Proble.
-
-
Wurstinator schrieb:
@ Tachyon:
@ pyhax: Dann sollte das Map-Element gelöscht oder so behandelt werden, als wäre hätte es den default-Wert.
.Warum machst du es dann nicht so, dass das du eine (Multi-)Map Listenelement -> Datum hast? Im ersten Schritt fügst du die Listenelemente als Keys der Map hinzu (mit default Datum als Wert) , im zweiten Schritt setzt du die entsprechenden Werte.
-
@ pyhax:
Wenn der Nutzer auf ein Datum klickt und dort schon etwas eingetragen hatte, soll dies natürlich auch angezeigt werden. Um das zu uberprüfen, müsste ich dann aber die ungeordneten values durchsuchen, was deutlich länger dauern würde.
-
Wurstinator schrieb:
@ pyhax:
Wenn der Nutzer auf ein Datum klickt und dort schon etwas eingetragen hatte, soll dies natürlich auch angezeigt werden. Um das zu uberprüfen, müsste ich dann aber die ungeordneten values durchsuchen, was deutlich länger dauern würde.boost::multimap
-
Wie soll mir eine Multimap helfen? Oder kann die Boost-Version was anderes, als die STL-Version?
-
Wurstinator schrieb:
Wie soll mir eine Multimap helfen? Oder kann die Boost-Version was anderes, als die STL-Version?
Oops, ich meinte boost::bimap

-
Okay, eine Bimap macht mehr Sinn als eine Multimap

Allerdings überlege ich mir noch, ob es sich lohnt, dafür Boost einzubinden. Mit Tachyons Methode dürfte eine normale Map auch reichen und ich kann weiterhin die Qt-Serialization nutzen.
-
Wurstinator schrieb:
Okay, eine Bimap macht mehr Sinn als eine Multimap

Allerdings überlege ich mir noch, ob es sich lohnt, dafür Boost einzubinden. Mit Tachyons Methode dürfte eine normale Map auch reichen und ich kann weiterhin die Qt-Serialization nutzen.Mit meiner "Methode" fliegt Dir, sofern Du das mit der Liste meinst, das Programm um die Ohren, wenn Du Elemente löscht. Wenn Du das Observer-Pattern für Dein Problem umsetzt, dann sollte das eigentlich gut gehen.
-
Ich habe mich auf das Obsever-Pattern bezogen, nicht auf die list anstatt vector
