<?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[Handle zu Objekt in Vektor]]></title><description><![CDATA[<p>Hallo Forum,<br />
Ich habe den Vektor</p>
<pre><code>std::vector&lt;Entity&gt; entities
</code></pre>
<p>und möchte bestimmte Entity Instanzen in diesem Vektor verfolgen.<br />
Dies ist alles kein Problem solange der Vektor nicht neu geordnet wird oder das Datenfeld eine neue Speicheradresse erhält, z.B. beim Überschreiten der reservierten Kapazität.</p>
<p>Der Vektor wird momentan durch die folgende Funktion von &quot;toten&quot; Entities gesäubert :</p>
<pre><code>entities.erase(std::remove_if(entities.begin(), entities.end(),
	[](Entity&amp; entity)
{
	return !entity.isAlive();
}), entities.end());
</code></pre>
<p>Was wäre eine elegante Methode Entity Handles zu implementieren ?<br />
Meine Ansätze wären dabei entweder den Index ins Datenfeld oder einen Zeiger direkt zur Speicheradresse des Entities zu verwenden. Allerdings werden diese aufgrund der oben genannten Anhaltspunkte ungültig. Also bräuchte ich einen cleveren Weg den Index oder Zeiger zu aktualisieren.<br />
Wäre dankbar für Ansätze oder Lösungen <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/topic/339716/handle-zu-objekt-in-vektor</link><generator>RSS for Node</generator><lastBuildDate>Sat, 11 Apr 2026 21:24:16 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/339716.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 22 Sep 2016 18:02:34 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Handle zu Objekt in Vektor on Thu, 22 Sep 2016 18:02:34 GMT]]></title><description><![CDATA[<p>Hallo Forum,<br />
Ich habe den Vektor</p>
<pre><code>std::vector&lt;Entity&gt; entities
</code></pre>
<p>und möchte bestimmte Entity Instanzen in diesem Vektor verfolgen.<br />
Dies ist alles kein Problem solange der Vektor nicht neu geordnet wird oder das Datenfeld eine neue Speicheradresse erhält, z.B. beim Überschreiten der reservierten Kapazität.</p>
<p>Der Vektor wird momentan durch die folgende Funktion von &quot;toten&quot; Entities gesäubert :</p>
<pre><code>entities.erase(std::remove_if(entities.begin(), entities.end(),
	[](Entity&amp; entity)
{
	return !entity.isAlive();
}), entities.end());
</code></pre>
<p>Was wäre eine elegante Methode Entity Handles zu implementieren ?<br />
Meine Ansätze wären dabei entweder den Index ins Datenfeld oder einen Zeiger direkt zur Speicheradresse des Entities zu verwenden. Allerdings werden diese aufgrund der oben genannten Anhaltspunkte ungültig. Also bräuchte ich einen cleveren Weg den Index oder Zeiger zu aktualisieren.<br />
Wäre dankbar für Ansätze oder Lösungen <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2509364</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2509364</guid><dc:creator><![CDATA[Yamahari]]></dc:creator><pubDate>Thu, 22 Sep 2016 18:02:34 GMT</pubDate></item><item><title><![CDATA[Reply to Handle zu Objekt in Vektor on Thu, 22 Sep 2016 19:39:30 GMT]]></title><description><![CDATA[<p>Muss das ein Vektor sein? Es wäre einfacher, eine andere Datenstruktur zu verwenden, wie map oder unordered_map mit dem Key als Handle.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2509372</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2509372</guid><dc:creator><![CDATA[Mechanics]]></dc:creator><pubDate>Thu, 22 Sep 2016 19:39:30 GMT</pubDate></item><item><title><![CDATA[Reply to Handle zu Objekt in Vektor on Thu, 22 Sep 2016 20:06:11 GMT]]></title><description><![CDATA[<p>Du könntest z.B. einen <code>std::vector&lt;std::unique_ptr&lt;Entity&gt;&gt;</code> verwenden - wenn sich das Vector-Layout ändert, bleibt die Entity trotzdem an derselben Stelle, nur der Zeiger steht anderswo im Speicher. Aber du musst natürlich dennoch beim erase beachten, dass du dann nicht mehr den gespeicherten Pointer nutzen kannst.</p>
<p>Du könntest auch std::shared_ptr&lt;Entity&gt; in deinen vector tun und als Observerklasse einen std::weak_ptr nehmen, dann stellt dieser mittels lock() fest, ob es den shared_ptr noch gibt oder nicht.</p>
<p>Könnte aber sein, dass diese Ansätze nicht zu deinem Problem passen. Wie groß ist denn <code>sizeof(Entity)</code> ? Je größer Entity ist, desto eher bieten sich diese <code>std::vector&lt;Pointertyp&gt;</code> -Lösungen an.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2509375</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2509375</guid><dc:creator><![CDATA[wob]]></dc:creator><pubDate>Thu, 22 Sep 2016 20:06:11 GMT</pubDate></item><item><title><![CDATA[Reply to Handle zu Objekt in Vektor on Thu, 22 Sep 2016 20:48:45 GMT]]></title><description><![CDATA[<p>wob schrieb:</p>
<blockquote>
<p>Du könntest z.B. einen <code>std::vector&lt;std::unique_ptr&lt;Entity&gt;&gt;</code> verwenden - wenn sich das Vector-Layout ändert, bleibt die Entity trotzdem an derselben Stelle, nur der Zeiger steht anderswo im Speicher.</p>
</blockquote>
<p>Oder einfach std::list... <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2509380</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2509380</guid><dc:creator><![CDATA[dot]]></dc:creator><pubDate>Thu, 22 Sep 2016 20:48:45 GMT</pubDate></item><item><title><![CDATA[Reply to Handle zu Objekt in Vektor on Fri, 23 Sep 2016 04:55:42 GMT]]></title><description><![CDATA[<p>dot schrieb:</p>
<blockquote>
<p>wob schrieb:</p>
<blockquote>
<p>Du könntest z.B. einen <code>std::vector&lt;std::unique_ptr&lt;Entity&gt;&gt;</code> verwenden - wenn sich das Vector-Layout ändert, bleibt die Entity trotzdem an derselben Stelle, nur der Zeiger steht anderswo im Speicher.</p>
</blockquote>
<p>Oder einfach std::list... <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
</blockquote>
<p>Ich will auch mal nochwas einwerfen: <code>boost::stable_vector</code> - wenns denn unbedingt etwas array-artiges sein soll und man nicht möchte dass einem Referenzen unterm Arsch weggezogen werden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2509392</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2509392</guid><dc:creator><![CDATA[Finnegan]]></dc:creator><pubDate>Fri, 23 Sep 2016 04:55:42 GMT</pubDate></item><item><title><![CDATA[Reply to Handle zu Objekt in Vektor on Fri, 23 Sep 2016 14:20:06 GMT]]></title><description><![CDATA[<p>Mechanics schrieb:</p>
<blockquote>
<p>Muss das ein Vektor sein? Es wäre einfacher, eine andere Datenstruktur zu verwenden, wie map oder unordered_map mit dem Key als Handle.</p>
</blockquote>
<p>Der Vorteil eines Vektors bestehend darin, dass die Elemente kontinuierlich im Speicher untergebracht sind. Das beschleunigt das Iterieren enorm; besonders wenn jedes System eben dies 60 Mal in der Sekunde macht.</p>
<p>wob schrieb:</p>
<blockquote>
<p>Du könntest z.B. einen <code>std::vector&lt;std::unique_ptr&lt;Entity&gt;&gt;</code> verwenden - wenn sich das Vector-Layout ändert, bleibt die Entity trotzdem an derselben Stelle, nur der Zeiger steht anderswo im Speicher. Aber du musst natürlich dennoch beim erase beachten, dass du dann nicht mehr den gespeicherten Pointer nutzen kannst.</p>
<p>Du könntest auch std::shared_ptr&lt;Entity&gt; in deinen vector tun und als Observerklasse einen std::weak_ptr nehmen, dann stellt dieser mittels lock() fest, ob es den shared_ptr noch gibt oder nicht.</p>
<p>Könnte aber sein, dass diese Ansätze nicht zu deinem Problem passen. Wie groß ist denn <code>sizeof(Entity)</code> ? Je größer Entity ist, desto eher bieten sich diese <code>std::vector&lt;Pointertyp&gt;</code> -Lösungen an.</p>
</blockquote>
<p>Der Hintergedanke beim Vektor besteht eben darin, wie oben schon erwähnt, dass die Entities alle nebeneinander im Speicher liegen. Das erhöht die Performance bei häufigem Iterieren deutlich. Einen Zeiger zu verwenden würde dem ursprünglichen Gedanken eher entgegenwirken. Momentan sehen meine Entities wie folgt aus:</p>
<pre><code>template &lt; typename T &gt;
struct Entity
{
	bool alive;
	typename T::Signature signature;
	std::map&lt;std::size_t, std::size_t&gt; componentDataIndices;
};
</code></pre>
<p>Vielleicht muss ich auch noch einmal mein Layout überdenken, so brauch ich im Endeffekt vielleicht sogar gar keine Handles mehr.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2509416</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2509416</guid><dc:creator><![CDATA[Yamahari]]></dc:creator><pubDate>Fri, 23 Sep 2016 14:20:06 GMT</pubDate></item><item><title><![CDATA[Reply to Handle zu Objekt in Vektor on Fri, 23 Sep 2016 14:26:36 GMT]]></title><description><![CDATA[<p>Yamahari schrieb:</p>
<blockquote>
<p>Mechanics schrieb:</p>
<blockquote>
<p>Muss das ein Vektor sein? Es wäre einfacher, eine andere Datenstruktur zu verwenden, wie map oder unordered_map mit dem Key als Handle.</p>
</blockquote>
<p>Der Vorteil eines Vektors bestehend darin, dass die Elemente kontinuierlich im Speicher untergebracht sind.</p>
</blockquote>
<p>Damit die Element aber immer kontinuierlich im Speicher untergebracht sein können, müssen bei Änderungen am Vektor dessen Elemente im Speicher verschoben werden, womit wie beim Ausgangsproblem sind. Gleichbleibende Adresse der Elemente und zusammenhängende Speicherung einer dynamisch veränderlichen Sequenz an Elementen schließen sich also rein prinzipiell gegenseitig aus... <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2509417</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2509417</guid><dc:creator><![CDATA[dot]]></dc:creator><pubDate>Fri, 23 Sep 2016 14:26:36 GMT</pubDate></item><item><title><![CDATA[Reply to Handle zu Objekt in Vektor on Fri, 23 Sep 2016 15:51:31 GMT]]></title><description><![CDATA[<p>Yamahari schrieb:</p>
<blockquote>
<p>Der Vorteil eines Vektors bestehend darin, dass die Elemente kontinuierlich im Speicher untergebracht sind. Das beschleunigt das Iterieren enorm; besonders wenn jedes System eben dies 60 Mal in der Sekunde macht.</p>
</blockquote>
<p>Ja, das hat schon was, ich verwende auch gern Vektoren, auch sowas wie boost::flat_map. Du musst aber schauen, ob sich das wirklich lohnt und ob du dir dadurch nicht unnötige Nachteile einhandelst. 60 mal pro Sekunde hört sich jetzt nicht nach so viel an (du wirst wahrscheinlich mehr Probleme mit dem Scheduling des Betriebssystems haben) und so wahnsinnig groß wird der Vorteil beim Iterieren auch nicht sein. Da musst du abwägen (und messen), was mehr ins Gewicht fällt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2509424</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2509424</guid><dc:creator><![CDATA[Mechanics]]></dc:creator><pubDate>Fri, 23 Sep 2016 15:51:31 GMT</pubDate></item><item><title><![CDATA[Reply to Handle zu Objekt in Vektor on Sat, 01 Oct 2016 12:26:00 GMT]]></title><description><![CDATA[<p>Mechanics schrieb:</p>
<blockquote>
<p>Yamahari schrieb:</p>
<blockquote>
<p>Der Vorteil eines Vektors bestehend darin, dass die Elemente kontinuierlich im Speicher untergebracht sind. Das beschleunigt das Iterieren enorm; besonders wenn jedes System eben dies 60 Mal in der Sekunde macht.</p>
</blockquote>
<p>Ja, das hat schon was, ich verwende auch gern Vektoren, auch sowas wie boost::flat_map. Du musst aber schauen, ob sich das wirklich lohnt und ob du dir dadurch nicht unnötige Nachteile einhandelst. 60 mal pro Sekunde hört sich jetzt nicht nach so viel an (du wirst wahrscheinlich mehr Probleme mit dem Scheduling des Betriebssystems haben) und so wahnsinnig groß wird der Vorteil beim Iterieren auch nicht sein. Da musst du abwägen (und messen), was mehr ins Gewicht fällt.</p>
</blockquote>
<p>60 mal pro Sekunde * die Anzahl der Systeme, um genau zu sein. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /><br />
Achja meine Entity Klasse sieht jetzt übrigens wie folgt aus, falls es jemanden interessiert:</p>
<pre><code>template &lt; typename TSettings &gt;
class Entity
{
public:
	Entity()
		: alive_{ true }
	{}

	~Entity() = default;

	Entity(const Entity&amp; entity) = default;
	Entity(Entity&amp;&amp; entity) = default;

public:
	Entity&amp; operator=(const Entity&amp; entity) = default;
	Entity&amp; operator=(Entity&amp;&amp; entity) = default;

public:
	template &lt; typename T, typename = std::enable_if_t&lt;TSettings::template IsComponent&lt;T&gt;::value&gt; &gt;
	void addComponentDataIndex(typename TSettings::DataIndex index) noexcept
	{
		componentDataIndices_.emplace(TSettings::template ComponentId&lt;T&gt;::value, index);
	}

	template &lt; typename T, typename = std::enable_if_t&lt;TSettings::template IsTag&lt;T&gt;::value&gt; &gt;
	void attachTag() noexcept
	{
		signature_[TSettings::ComponentCount::value + TSettings::template TagId&lt;T&gt;::value] = true;
	}

	template &lt; typename T, typename = std::enable_if_t&lt;TSettings::template IsTag&lt;T&gt;::value&gt; &gt;
	void detachTag() noexcept
	{
		signature_[TSettings::ComponentCount::value + TSettings::template TagId&lt;T&gt;::value] = false;
	}

	template &lt; typename T, typename = std::enable_if_t&lt;TSettings::template IsComponent&lt;T&gt;::value&gt; &gt;
	void removeComponentDataIndex() noexcept
	{
		componentDataIndices_.erase(TSettings::template ComponentId&lt;T&gt;::value);
	}

	template &lt; typename T, typename = std::enable_if_t&lt;TSettings::template IsComponent&lt;T&gt;::value&gt; &gt;
	void setComponentSignatureBit(bool value) noexcept
	{
		signature_[TSettings::template ComponentId&lt;T&gt;::value] = value;
	}

	template &lt; typename T, typename = std::enable_if_t&lt;TSettings::template IsTag&lt;T&gt;::value&gt; &gt;
	bool hasTag() const noexcept
	{
		return signature_[TSettings::ComponentCount::value + TSettings::template TagId&lt;T&gt;::value];
	}

	template &lt; typename T, typename = std::enable_if_t&lt;TSettings::template IsComponent&lt;T&gt;::value&gt; &gt;
	auto getComponentDataIndex() const noexcept
	{
		return componentDataIndices_[TSettings::template ComponentId&lt;T&gt;::value];
	}

public:
	void kill() noexcept
	{
		alive_ = false;
	}

	bool isAlive() const noexcept
	{
		return alive_;
	}

	const auto&amp; getComponentDataIndices() const noexcept
	{
		return componentDataIndices_;
	}

	const auto&amp; getSignature() const noexcept
	{
		return signature_;
	}

private:
	bool alive_;
	std::map&lt;typename TSettings::ComponentIndex, typename TSettings::DataIndex&gt; componentDataIndices_;
	typename TSettings::Signature signature_;
};
</code></pre>
<p>Das Problem mit den Handles besteht auch noch, kümmere ich mich aber später drum <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f921.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--clown_face"
      title=":clown:"
      alt="🤡"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2510292</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2510292</guid><dc:creator><![CDATA[Yamahari]]></dc:creator><pubDate>Sat, 01 Oct 2016 12:26:00 GMT</pubDate></item></channel></rss>