Objekte verwalten
-
Mal eine Frage an euch.
Folgedes Problem.
Ich habe eine Struktur.
struct OBJECT { int wert; ...und noch vieles mehr.... int ID; // ID der Struktur Object }
für diese Struktur will ich einen Objectmanager erstellen. Also ein Object(im Sinne von C++) das dazu da ist eine unbekannte Anzahl von diesen Strukturen zu verwalten.
class OBJECTMANAGER{ private: std::vector<OBJECT> m_vopject; int GetID(....); int Mache_Was_Mit_OBJECT(int ID); //Hier wird etwas mit der ID gemacht. ...
Jede Struktur hat eine ID mit der man auf diese zugreifen kann. Es können auch Strukturen zerstört oder erstellet werden. Also die Anzahl der Strukturen ist variabel.
Wie würdet ihr das mit der ID machen. Soll ich einen Zeiger auf die Struktur speichern? Oder wie würde das am besten gehen.
-
Je nach dem .... Worauf es dir ankommt
Beschreib mal naeher, was in deiner struct drinn ist, wie gross das teil eigentlich ist ....
Wenn es ned allzugross ist (wenige kb) dann wuerd ich die struktur direktspeichern, und ZuweisungsOp / CCTOR nutzen.
Ist die Strukt doch groesser, wuerd ich dynamisch (also Zeiger) verwenden. Die aber guenstigerweisse in ner Klasse wrappen ....Ist deine Struktur festgeschrieben ??? (Also hast irgendwo nen Module / Aufruf, der unbedingt die Struktur haben will ???)
Vector wuerd ich nur nehmen wenn du die Strukturen unbedingt am Stueck vorliegen haben musst, und / oder du wahnsinnig schnellen Zugriff per Index brauchst. Das setzt auch vorraus, das dein index wirklich fortlaufend ist. Ansonsten wuerd ich ohne Index arbeiten und List / Set bevorzugen ...
Ciao ...
-
Wenn du weißt, dass deine ID`s eindeutig sind, dann kannst du map nehmen, ansonsten multimap.
Ich denke, das passt am besten zu deinem Problem.typedef long ID; typedef std::map<ID, OBJECT> ObjectMap; ...
-
Ich brauche die Struktur auch in anderen Funktionen. Diese speichert noch mehrere Werte. Position, Größe ect... Und es muss schnell gehen deshalb der <vector>. Der Objectmanager muss pro Frame die ganze List durchlaufen, die Einträge sortieren und noch ein paar andere schöne Sachen damit machen.
Erst wollte ich über den Index von <vector> auf die Strukturen zugreifen. Doch wenn eine Struktur gelöscht wird oder eine neue eingefügt, müsste man alle IDs in den Strukturen überarbeiten. Das ist nicht sehr schlau wenn es um speed geht.
-
electron schrieb:
Wenn du weißt, dass deine ID`s eindeutig sind, dann kannst du map nehmen, ansonsten multimap.
Ich denke, das passt am besten zu deinem Problem.typedef long ID; typedef std::map<ID, OBJECT> ObjectMap; ...
Ja die IDs sind eindeutig, sie gehören nur zu dieser Struktur. Ich schaue mir mal die maps an.
-
ne nen Vector ist ned Zwangslaeufig schnell, er ist nur der schnellste wenn es um den zugriff per index geht ...
Du solltest also genau analysieren, was schnell gehen muss.
Einfuegen/ loeschen / Xte Element bekommen / Elemnent mit der ID X bekommen / besitmmtes element suchen, etc...Das sind die punkte wo sich die Container unterscheiden.
Genau so wie die Objecte selbst. Nen Zeigerzugriff (oder nen Object was nur einen Zeiger Verwaltet) kostet (meist) 4 Byte. Die Container kopieren meist intern irre umher. Wenn man statt 64byte nur 4 byte kopiert, kann das schon was ausmachen. Dafuer ist das erzeugen von Objekten dynamisch ne ecke langsammer als wenn mans statisch macht. Also wenn man schnell und viel zugtausend objecte von vielleicht 24 Byte erstellen muss, macht man das lieber ned mit New ....
Ciao ..