<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Keine doppelten Einträge]]></title><description><![CDATA[<p>Szenario:</p>
<p>- Es gibt eine Liste an Objekten (std::vector)<br />
- Es werden asynchron von dieser Objektliste Objekte entnommen (<em>EDIT: Ich entnehme es nicht wirklich, ich verwende einen Zeiger. Entschuldigung für diese Falschbenutzung des Wortes</em>) und in eine &quot;in bearbeitung&quot; Liste getan (std::vector). Diese werden über die Zeit verändert.<br />
<strong>Ein Objekt darf dort nicht doppelt rein!</strong></p>
<p>Ich wollte eine Suche vermeiden um die Geschwindigkeit zu verbessern.<br />
Meine Idee:</p>
<p>eine std::map, die als key den Objektindex der ersten Liste erhält und als Wert den Index für &quot;in bearbeitung&quot;.</p>
<p>Also (so ungefähr):</p>
<pre><code class="language-cpp">typedef unsigned int OBJECT_ID_TYPE

struct Object { /* ... */ };

class Bearbeiten {
    std::vector &lt;Object&gt; List;
    std::map InList&lt;OBJECT_ID_TYPE, unsigned int&gt; Lookup;

public:
    void Add(const Object&amp; Obj, const OBJECT_ID_TYPE&amp; Id) {
        if (InList.find(Id) != InList.end())
        {
            // Alten Eintrag löschen
        }
        List.push_back(Obj);
        InList.insert(std::pair &lt;OBJECT_ID_TYPE, unsigned int&gt;(Id, List.size() - 1));
    }
};
</code></pre>
<p>Wie würdet ihr das machen?</p>
<p>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.</p>
<p>EDIT 2: Code korrigiert.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/302950/keine-doppelten-einträge</link><generator>RSS for Node</generator><lastBuildDate>Tue, 11 Aug 2026 01:02:23 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/302950.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 01 May 2012 17:33:29 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Keine doppelten Einträge on Wed, 02 May 2012 15:06:44 GMT]]></title><description><![CDATA[<p>Szenario:</p>
<p>- Es gibt eine Liste an Objekten (std::vector)<br />
- Es werden asynchron von dieser Objektliste Objekte entnommen (<em>EDIT: Ich entnehme es nicht wirklich, ich verwende einen Zeiger. Entschuldigung für diese Falschbenutzung des Wortes</em>) und in eine &quot;in bearbeitung&quot; Liste getan (std::vector). Diese werden über die Zeit verändert.<br />
<strong>Ein Objekt darf dort nicht doppelt rein!</strong></p>
<p>Ich wollte eine Suche vermeiden um die Geschwindigkeit zu verbessern.<br />
Meine Idee:</p>
<p>eine std::map, die als key den Objektindex der ersten Liste erhält und als Wert den Index für &quot;in bearbeitung&quot;.</p>
<p>Also (so ungefähr):</p>
<pre><code class="language-cpp">typedef unsigned int OBJECT_ID_TYPE

struct Object { /* ... */ };

class Bearbeiten {
    std::vector &lt;Object&gt; List;
    std::map InList&lt;OBJECT_ID_TYPE, unsigned int&gt; Lookup;

public:
    void Add(const Object&amp; Obj, const OBJECT_ID_TYPE&amp; Id) {
        if (InList.find(Id) != InList.end())
        {
            // Alten Eintrag löschen
        }
        List.push_back(Obj);
        InList.insert(std::pair &lt;OBJECT_ID_TYPE, unsigned int&gt;(Id, List.size() - 1));
    }
};
</code></pre>
<p>Wie würdet ihr das machen?</p>
<p>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.</p>
<p>EDIT 2: Code korrigiert.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2207311</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2207311</guid><dc:creator><![CDATA[5cript]]></dc:creator><pubDate>Wed, 02 May 2012 15:06:44 GMT</pubDate></item><item><title><![CDATA[Reply to Keine doppelten Einträge on Tue, 01 May 2012 17:50:34 GMT]]></title><description><![CDATA[<p>Wenn die Objekte alle eine eigene ID haben, warum vergleicht der operator== dann nicht bloß die IDs?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2207316</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2207316</guid><dc:creator><![CDATA[pyhax]]></dc:creator><pubDate>Tue, 01 May 2012 17:50:34 GMT</pubDate></item><item><title><![CDATA[Reply to Keine doppelten Einträge on Tue, 01 May 2012 18:00:31 GMT]]></title><description><![CDATA[<p>An welcher Stelle interessiert denn, ob ein Objekt &quot;in Bearbeitung&quot; ist oder nicht?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2207318</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2207318</guid><dc:creator><![CDATA[cooky451]]></dc:creator><pubDate>Tue, 01 May 2012 18:00:31 GMT</pubDate></item><item><title><![CDATA[Reply to Keine doppelten Einträge on Tue, 01 May 2012 18:14:35 GMT]]></title><description><![CDATA[<ol>
<li>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)</li>
<li>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.</li>
</ol>
<p>EDIT:</p>
<p>Ok Klartext:</p>
<p>Die Objekte sind sich bewegende Objekte in einem 2D Raum.<br />
Die in einem Thread ständig geupdatet werden (dessen Position)</p>
<p>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!).<br />
Ich will den alten also aus der Updateliste nehmen bevor ich den neuen Bewegungsbefehl in die Updateliste einsetze.</p>
<p>Frage am Rande: wirft <a href="http://map.at" rel="nofollow">map.at</a>() eine Exception, wenn's den key nicht gibt?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2207321</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2207321</guid><dc:creator><![CDATA[5cript]]></dc:creator><pubDate>Tue, 01 May 2012 18:14:35 GMT</pubDate></item><item><title><![CDATA[Reply to Keine doppelten Einträge on Wed, 02 May 2012 08:36:12 GMT]]></title><description><![CDATA[<p>Mir leuchtet nicht ein, wie überhaupt doppelte Einträge zustande kommen. Wenn Du ein Objekt aus einer Liste <strong>entnimmst</strong>, und es denn in eine andere Liste einfügst, wie können dann Doubletten entstehen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2207449</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2207449</guid><dc:creator><![CDATA[Tachyon]]></dc:creator><pubDate>Wed, 02 May 2012 08:36:12 GMT</pubDate></item><item><title><![CDATA[Reply to Keine doppelten Einträge on Wed, 02 May 2012 15:05:39 GMT]]></title><description><![CDATA[<p>ok ich habe mich falsch ausgedrückt! EDIT: Ich erstelle ein Objekt, dass den Zeiger besitzt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2207630</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2207630</guid><dc:creator><![CDATA[5cript]]></dc:creator><pubDate>Wed, 02 May 2012 15:05:39 GMT</pubDate></item><item><title><![CDATA[Reply to Keine doppelten Einträge on Wed, 02 May 2012 15:55:06 GMT]]></title><description><![CDATA[<p>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...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2207649</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2207649</guid><dc:creator><![CDATA[dot]]></dc:creator><pubDate>Wed, 02 May 2012 15:55:06 GMT</pubDate></item><item><title><![CDATA[Reply to Keine doppelten Einträge on Wed, 02 May 2012 16:06:02 GMT]]></title><description><![CDATA[<p>Kannst du nicht jedem Object ein <code>bool processing</code> geben und das Objekt nur dann hinzufügen, wenn der Wert false ist (und du ihn anschliessend auf true setzt)?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2207658</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2207658</guid><dc:creator><![CDATA[brainstormer]]></dc:creator><pubDate>Wed, 02 May 2012 16:06:02 GMT</pubDate></item><item><title><![CDATA[Reply to Keine doppelten Einträge on Wed, 02 May 2012 16:53:06 GMT]]></title><description><![CDATA[<p>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.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2207691</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2207691</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Wed, 02 May 2012 16:53:06 GMT</pubDate></item><item><title><![CDATA[Reply to Keine doppelten Einträge on Wed, 02 May 2012 17:24:00 GMT]]></title><description><![CDATA[<p>- Der Vorschlag von pumuckl [DELETED]<br />
EDIT: Okay ich habe es nochmal anders betrachtet... Ja den Vorschlag mag ich</p>
<p>- Ja, ein booleschen Wert könnte ich denen auch geben... o.ä.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2207702</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2207702</guid><dc:creator><![CDATA[5cript]]></dc:creator><pubDate>Wed, 02 May 2012 17:24:00 GMT</pubDate></item></channel></rss>