<?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[Effizienter Container für EntityIds]]></title><description><![CDATA[<p>Hallo,<br />
ich habe folgende Klasse für das Erstellen und Entfernen von Ids.<br />
Meine erste Frage: Ist die Art und Weise auf diejenige die Klasse funktioniert effizient und bzw. oder gibt es noch effizientere Methoden dies zu erreichen ?</p>
<p>Da ich C++/ Programmieren nur nebenbei, als vorläufiges Hobby, lerne, habe ich auch noch andere Fragen, die im Code zu finden sind.</p>
<p>Im Voraus schon einmal Danke <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f44d.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--thumbs_up"
      title=":+1:"
      alt="👍"
    /></p>
<pre><code>#include &lt;iostream&gt;
#include &lt;utility&gt;
#include &lt;vector&gt;

using namespace std;

class Ids
{
public:
	Ids(size_t maxIds, size_t maxfreeIds){ ids_.reserve(maxIds); freeIds_.reserve(maxfreeIds); }

	size_t add()
	{
		if (freeIds_.empty())
		{
			ids_.push_back(createUniqueId()); // &lt;- wird das Ergebnis von createUniqueId kopiert oder verschoben(?) ? 
		}
		else
		{
			ids_.push_back(freeIds_.back()); 
			freeIds_.pop_back();
		}

		return ids_.back();
	}

	void remove(size_t id)
	{
		swap(ids_[id], ids_.back()); // vector::at : vector::operator[] ?  

		freeIds_.push_back(ids_.back());
		ids_.pop_back();
	}

	void test() // wie der Name suggeriert, nur zum testen 
	{
		cout &lt;&lt; &quot;Size of ids_: &quot;     &lt;&lt; ids_.size()     &lt;&lt; &quot; Capacity of ids_: &quot;     &lt;&lt; ids_.capacity()     &lt;&lt; &quot; MaxSize of ids_: &quot;     &lt;&lt; ids_.max_size() &lt;&lt; endl;
		cout &lt;&lt; &quot;Size of freeIds_: &quot; &lt;&lt; freeIds_.size() &lt;&lt; &quot; Capacity of freeIds_: &quot; &lt;&lt; freeIds_.capacity() &lt;&lt; &quot; MaxSize of freeIds_: &quot; &lt;&lt; freeIds_.max_size() &lt;&lt; endl;
	}

	void printIds()
	{
		for (auto&amp; i : ids_){ cout &lt;&lt; i &lt;&lt; endl; }
	}

private:
	inline size_t createUniqueId() const
	{
		static size_t lastId{ 0u };
		return lastId++;
	}

	vector&lt;size_t&gt; ids_;
	vector&lt;size_t&gt; freeIds_;
};
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/topic/337175/effizienter-container-für-entityids</link><generator>RSS for Node</generator><lastBuildDate>Sat, 18 Apr 2026 10:02:38 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/337175.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 13 Mar 2016 16:39:43 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Effizienter Container für EntityIds on Sun, 13 Mar 2016 16:52:35 GMT]]></title><description><![CDATA[<p>Hallo,<br />
ich habe folgende Klasse für das Erstellen und Entfernen von Ids.<br />
Meine erste Frage: Ist die Art und Weise auf diejenige die Klasse funktioniert effizient und bzw. oder gibt es noch effizientere Methoden dies zu erreichen ?</p>
<p>Da ich C++/ Programmieren nur nebenbei, als vorläufiges Hobby, lerne, habe ich auch noch andere Fragen, die im Code zu finden sind.</p>
<p>Im Voraus schon einmal Danke <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f44d.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--thumbs_up"
      title=":+1:"
      alt="👍"
    /></p>
<pre><code>#include &lt;iostream&gt;
#include &lt;utility&gt;
#include &lt;vector&gt;

using namespace std;

class Ids
{
public:
	Ids(size_t maxIds, size_t maxfreeIds){ ids_.reserve(maxIds); freeIds_.reserve(maxfreeIds); }

	size_t add()
	{
		if (freeIds_.empty())
		{
			ids_.push_back(createUniqueId()); // &lt;- wird das Ergebnis von createUniqueId kopiert oder verschoben(?) ? 
		}
		else
		{
			ids_.push_back(freeIds_.back()); 
			freeIds_.pop_back();
		}

		return ids_.back();
	}

	void remove(size_t id)
	{
		swap(ids_[id], ids_.back()); // vector::at : vector::operator[] ?  

		freeIds_.push_back(ids_.back());
		ids_.pop_back();
	}

	void test() // wie der Name suggeriert, nur zum testen 
	{
		cout &lt;&lt; &quot;Size of ids_: &quot;     &lt;&lt; ids_.size()     &lt;&lt; &quot; Capacity of ids_: &quot;     &lt;&lt; ids_.capacity()     &lt;&lt; &quot; MaxSize of ids_: &quot;     &lt;&lt; ids_.max_size() &lt;&lt; endl;
		cout &lt;&lt; &quot;Size of freeIds_: &quot; &lt;&lt; freeIds_.size() &lt;&lt; &quot; Capacity of freeIds_: &quot; &lt;&lt; freeIds_.capacity() &lt;&lt; &quot; MaxSize of freeIds_: &quot; &lt;&lt; freeIds_.max_size() &lt;&lt; endl;
	}

	void printIds()
	{
		for (auto&amp; i : ids_){ cout &lt;&lt; i &lt;&lt; endl; }
	}

private:
	inline size_t createUniqueId() const
	{
		static size_t lastId{ 0u };
		return lastId++;
	}

	vector&lt;size_t&gt; ids_;
	vector&lt;size_t&gt; freeIds_;
};
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2490230</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2490230</guid><dc:creator><![CDATA[Yamahari]]></dc:creator><pubDate>Sun, 13 Mar 2016 16:52:35 GMT</pubDate></item><item><title><![CDATA[Reply to Effizienter Container für EntityIds on Sun, 13 Mar 2016 23:34:15 GMT]]></title><description><![CDATA[<p>Auf den ersten flüchtigen Blick würde ich sagen, dass man auf den Vektor <code>ids_</code> verzichten kann. Die IDs in diesem kann man indirekt ermitteln,<br />
da es sich dabei um alle Zahlen ≤ <code>lastId</code> handelt, die sich nicht in <code>freeIds_</code> befinden.</p>
<p>Ebenso lässt sich Speicher sparen, wenn man in <code>freeIds_</code> nur diejenigen freien IDs speichert, die ≤ <code>lastId</code> sind. Dann ist <code>freeIds_</code> zu Anfang leer,<br />
und wird nur dann gefüllt, wenn eine ID freigegeben wird. Die freien IDs sind dann alle Zahlen &gt; <code>lastId_</code> und &lt;= <code>maxIds</code> plus diejenigen, die sich in <code>freeIds_</code> befinden.</p>
<p>Wenn man es so handhabt, darf <code>maxIds</code> auch größer als der Arbeitspeicher sein und es können dabei sogar fast alle IDs vergeben sein, falls sich nicht zu viele davon in der<br />
<code>freeIds_</code> -Liste befinden (eventuell kann man auch <code>lastId</code> wieder reduzieren, wenn die hinteren IDs alle frei sind).</p>
<p>Noch effizienter könnte eine einfache fortlaufende Nummer sein ohne dass die frei gewordenen IDs erneut vergeben werden. Bei 64 Bit Breite kann das je nach Anwendungsfall durchaus für ein paar<br />
hundert Jahre Laufzeit ausreichen (wenn ich ich nicht verrechnet habe kann man damit etwa 580 Millionen Jahre lang 1000 IDs pro Sekunde vergeben).</p>
<p>Die effizienteste Lösung ist natürlich wenn man überhaupt keine IDs benötigt. Schliesslich lässt sich jedes Objekt im Speicher auch eindeutig durch seine Adresse identifizieren.<br />
Das hängt aber stark davon ab was für ein Problem du damit lösen willst.</p>
<p>Finnegan</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2490234</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2490234</guid><dc:creator><![CDATA[Finnegan]]></dc:creator><pubDate>Sun, 13 Mar 2016 23:34:15 GMT</pubDate></item><item><title><![CDATA[Reply to Effizienter Container für EntityIds on Sun, 13 Mar 2016 17:31:15 GMT]]></title><description><![CDATA[<p>Deine <code>remove</code> Funktion ist fehlerhaft.<br />
Die bekommt eine ID übergeben, verwendet diese dann aber als Index in <code>ids_</code> .</p>
<p>Was die Effizienz angeht kann ich mich dem anschliessen was Finnegan schon geschrieben hat. Ob es effizient ist was du da machst kann man nicht sagen, ohne zu wissen welches Problem du damit eigentlich lösen willst.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2490237</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2490237</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Sun, 13 Mar 2016 17:31:15 GMT</pubDate></item></channel></rss>