Keine doppelten Einträge
-
Szenario:
- Es gibt eine Liste an Objekten (std::vector)
- Es werden asynchron von dieser Objektliste Objekte entnommen (EDIT: Ich entnehme es nicht wirklich, ich verwende einen Zeiger. Entschuldigung für diese Falschbenutzung des Wortes) und in eine "in bearbeitung" Liste getan (std::vector). Diese werden über die Zeit verändert.
Ein Objekt darf dort nicht doppelt rein!Ich wollte eine Suche vermeiden um die Geschwindigkeit zu verbessern.
Meine Idee:eine std::map, die als key den Objektindex der ersten Liste erhält und als Wert den Index für "in bearbeitung".
Also (so ungefähr):
typedef unsigned int OBJECT_ID_TYPE struct Object { /* ... */ }; class Bearbeiten { std::vector <Object> List; std::map InList<OBJECT_ID_TYPE, unsigned int> Lookup; public: void Add(const Object& Obj, const OBJECT_ID_TYPE& Id) { if (InList.find(Id) != InList.end()) { // Alten Eintrag löschen } List.push_back(Obj); InList.insert(std::pair <OBJECT_ID_TYPE, unsigned int>(Id, List.size() - 1)); } };Wie würdet ihr das machen?
EDIT: Nach dem Objekt im vector direkt suchen ist glaube ich keine so gute Idee. Das Objekt ist recht komplex und der Aufruf des operators== ist vermutlich länger als der standardmäßige Vergleich zweier Integers.
EDIT 2: Code korrigiert.
-
Wenn die Objekte alle eine eigene ID haben, warum vergleicht der operator== dann nicht bloß die IDs?
-
An welcher Stelle interessiert denn, ob ein Objekt "in Bearbeitung" ist oder nicht?
-
- Da sich die Objekte ständig verändern kann ich sie nicht direkt auf Gleichheit prüfen! (find direkt im vector geht eh nicht, so wie der operator implementiert ist)
- Die ID ist die Position im std::vector und dann müsste das Objekt die kenne, das finde ich nicht so schön - EDIT: Wobei das schöner ist als mit der map! Umsetzbar wäre es auch, ohne dabei mir die Objekte zu verschandeln, weil das eigentliche Objekt nochmal in einer Struktur steckt, die spezielle Informationen für den Prozess enthält.
EDIT:
Ok Klartext:
Die Objekte sind sich bewegende Objekte in einem 2D Raum.
Die in einem Thread ständig geupdatet werden (dessen Position)Ich kann aber nicht 2 Bewegungsbefehle auf einmal verarbeiten, sondern nur einen (sonst würde der sonst was machen oder im Kreis rennen, was weiß ich!).
Ich will den alten also aus der Updateliste nehmen bevor ich den neuen Bewegungsbefehl in die Updateliste einsetze.Frage am Rande: wirft map.at() eine Exception, wenn's den key nicht gibt?
-
Mir leuchtet nicht ein, wie überhaupt doppelte Einträge zustande kommen. Wenn Du ein Objekt aus einer Liste entnimmst, und es denn in eine andere Liste einfügst, wie können dann Doubletten entstehen?
-
ok ich habe mich falsch ausgedrückt! EDIT: Ich erstelle ein Objekt, dass den Zeiger besitzt.
-
Kannst du nicht einfach alle zu bearbeitenden Objekte in eine Queue packen und die dann einfach dort rauspoppen? Dann wirst du niemals ein Problem haben...
-
Kannst du nicht jedem Object ein
bool processinggeben und das Objekt nur dann hinzufügen, wenn der Wert false ist (und du ihn anschliessend auf true setzt)?
-
Häng den Bewegungsbefehl doch per Pointer an die Objekte ran. Wenn du einen neuen Befehl bekommst, wirf den alten weg und ersetze ihn durch den neuen. Das Objekt kann dann in der Verarbeitungsliste einfach drin bleiben.
-
- Der Vorschlag von pumuckl [DELETED]
EDIT: Okay ich habe es nochmal anders betrachtet... Ja den Vorschlag mag ich- Ja, ein booleschen Wert könnte ich denen auch geben... o.ä.