<?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[STL: Map - freien schluessel finden.]]></title><description><![CDATA[<p>hi zusammen,</p>
<p>ich bin gerade dabei eine Anwendung zu schreiben, in der ich mit eindeutigen Objekten arbeite, die mit einer ID versehen sind. Da ich sehr haeufig auf einzelne Objekte zugreifen muss verwende ich dazu die map-container Klasse. Wenn ich ein neues Objekt speichern will muss ich allerdings sicherstellen, dass die ObjektID die ich dafuer verwende auch wirklich frei ist. Dazu lauefe ich in einer simplem Schleife durch die map, beginnend bei der letzten vergebenen ID. Da das ganze sehr dynamisch ist und Objekte haeufig geloescht udn angelegt werden bin ich mir nicht sicher, ob das so eine gute Loesung ist.<br />
Gibt es denn eine einfachere und performantere Moeglichkeit nicht vergebene Schluessel innerhalb der map zu finden?</p>
<p>So ungefaehr sieht die jetzige Routine aus:</p>
<pre><code>blnFound = false;
iLoop = 0;
iObjectID = this-&gt;iLastObjectID;

while( !blnFound &amp;&amp; (iLoop &lt; (MAX_OBJECTID - MIN_OBJECTID)) )
{
      /* free? */
	if( !this-&gt;pObjectIDMap-&gt;count(iObjectID) )
	{
		blnFound = true;
	}
	else
	{
		/* next ObjectID */
		if( iObjectID &gt; MAX_OBJECTID )
		{
			iObjectID = MIN_OBJECTID;
		}
		else
		{
			iObjectID++;
		}		
	}

	/* prevent infinite loop */
	iLoop++;
}
</code></pre>
<p>Gruss<br />
snuggl3s</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/163208/stl-map-freien-schluessel-finden</link><generator>RSS for Node</generator><lastBuildDate>Sat, 12 Sep 2026 23:38:47 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/163208.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 27 Oct 2006 06:00:14 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to STL: Map - freien schluessel finden. on Fri, 27 Oct 2006 06:00:14 GMT]]></title><description><![CDATA[<p>hi zusammen,</p>
<p>ich bin gerade dabei eine Anwendung zu schreiben, in der ich mit eindeutigen Objekten arbeite, die mit einer ID versehen sind. Da ich sehr haeufig auf einzelne Objekte zugreifen muss verwende ich dazu die map-container Klasse. Wenn ich ein neues Objekt speichern will muss ich allerdings sicherstellen, dass die ObjektID die ich dafuer verwende auch wirklich frei ist. Dazu lauefe ich in einer simplem Schleife durch die map, beginnend bei der letzten vergebenen ID. Da das ganze sehr dynamisch ist und Objekte haeufig geloescht udn angelegt werden bin ich mir nicht sicher, ob das so eine gute Loesung ist.<br />
Gibt es denn eine einfachere und performantere Moeglichkeit nicht vergebene Schluessel innerhalb der map zu finden?</p>
<p>So ungefaehr sieht die jetzige Routine aus:</p>
<pre><code>blnFound = false;
iLoop = 0;
iObjectID = this-&gt;iLastObjectID;

while( !blnFound &amp;&amp; (iLoop &lt; (MAX_OBJECTID - MIN_OBJECTID)) )
{
      /* free? */
	if( !this-&gt;pObjectIDMap-&gt;count(iObjectID) )
	{
		blnFound = true;
	}
	else
	{
		/* next ObjectID */
		if( iObjectID &gt; MAX_OBJECTID )
		{
			iObjectID = MIN_OBJECTID;
		}
		else
		{
			iObjectID++;
		}		
	}

	/* prevent infinite loop */
	iLoop++;
}
</code></pre>
<p>Gruss<br />
snuggl3s</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1162301</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1162301</guid><dc:creator><![CDATA[snuggl3s]]></dc:creator><pubDate>Fri, 27 Oct 2006 06:00:14 GMT</pubDate></item><item><title><![CDATA[Reply to STL: Map - freien schluessel finden. on Fri, 27 Oct 2006 06:11:37 GMT]]></title><description><![CDATA[<p>Wenn du die IDs nur zur Laufzeit benötigst eigenet sich hierzu zum Beispiel die Speicheradresse des Objekts... (üblicherweise ist diese eindeutig). :p<br />
Ansonsten könnte man auch UUIDs von Windows erzeugen lassen.</p>
<p>(Ganz abgesehen davon sind Maps sowie Sets zwecks effektiver Suche sortiert ... ausschließlich das letzte Element zu betrachten tuts also auch.)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1162305</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1162305</guid><dc:creator><![CDATA[Mathias]]></dc:creator><pubDate>Fri, 27 Oct 2006 06:11:37 GMT</pubDate></item><item><title><![CDATA[Reply to STL: Map - freien schluessel finden. on Fri, 27 Oct 2006 06:13:19 GMT]]></title><description><![CDATA[<p>Du brauchst doch keine Schleife über die gesammte Hashmap zu laufen. Aus dem Key wird doch ein Hashcode errechnet und das Objekt an dieser Position gespeichert. Wenn du wieder das Objekt haben willst, wird wieder aus dem Key der Hashcode berechnet und die Map weis sofort wo sich das Objekt befindet.</p>
<p>Du brauchst nur:</p>
<pre><code class="language-cpp">while ( map.contains_key(key) == true ) { key = berechneNeuenKey(); }
map.put(key, meinObject);
</code></pre>
<p>map.contains_key(key) braucht im Idealfall nur O(1), weil da nur der Hashcode berechnet werden muss. Deine Schleife kannst dir da sparen.</p>
<blockquote>
<p>(Ganz abgesehen davon sind Maps sowie Sets zwecks effektiver Suche sortiert ... ausschließlich das letzte Element zu betrachten tuts also auch.)</p>
</blockquote>
<p>Seit wann ist eine Hashmap oder ein Hashset sortiert???</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1162309</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1162309</guid><dc:creator><![CDATA[DEvent]]></dc:creator><pubDate>Fri, 27 Oct 2006 06:13:19 GMT</pubDate></item><item><title><![CDATA[Reply to STL: Map - freien schluessel finden. on Fri, 27 Oct 2006 06:23:20 GMT]]></title><description><![CDATA[<p>DEvent schrieb:</p>
<blockquote>
<p>Seit wann ist eine Hashmap oder ein Hashset sortiert???</p>
</blockquote>
<p>Seit wann ist eine STL-Map (ich gehe mal davon aus dass std::map gemeint ist) eine Hashmap?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1162315</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1162315</guid><dc:creator><![CDATA[LordJaxom]]></dc:creator><pubDate>Fri, 27 Oct 2006 06:23:20 GMT</pubDate></item><item><title><![CDATA[Reply to STL: Map - freien schluessel finden. on Fri, 27 Oct 2006 06:28:23 GMT]]></title><description><![CDATA[<p>LordJaxom schrieb:</p>
<blockquote>
<p>DEvent schrieb:</p>
<blockquote>
<p>Seit wann ist eine Hashmap oder ein Hashset sortiert???</p>
</blockquote>
<p>Seit wann ist eine STL-Map (ich gehe mal davon aus dass std::map gemeint ist) eine Hashmap?</p>
</blockquote>
<p><img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f62e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_open_mouth"
      title=":open_mouth:"
      alt="😮"
    /> hm bin Java gewöhnt, ist den std::map keine Hashmap?</p>
<p>Edit:<br />
Okay, die STL ist ja total anderes aufgebaut als die Java API. Gut dann bezieht sich mein Vorschlag nur auf Hashmaps.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1162316</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1162316</guid><dc:creator><![CDATA[DEvent]]></dc:creator><pubDate>Fri, 27 Oct 2006 06:28:23 GMT</pubDate></item><item><title><![CDATA[Reply to STL: Map - freien schluessel finden. on Fri, 27 Oct 2006 06:29:18 GMT]]></title><description><![CDATA[<p>Îch kann jetzt nicht den Standard zitieren, aber alle Implementierungen die mir bislang über den Weg gelaufen sind waren balanced binary trees.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1162318</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1162318</guid><dc:creator><![CDATA[LordJaxom]]></dc:creator><pubDate>Fri, 27 Oct 2006 06:29:18 GMT</pubDate></item><item><title><![CDATA[Reply to STL: Map - freien schluessel finden. on Fri, 27 Oct 2006 07:36:10 GMT]]></title><description><![CDATA[<p>std::map ist definitiv keine Hashmap! Es ist eine einfacher pair-Container. Nicht mehr und nicht weniger. Das einzige besondere ist, das beim einfügen von pairs diese gleich an die richtige sortierte Stelle eingefügt werden.</p>
<p>Wer Hashmaps braucht, sollte auch die std::tr1::hash_map nutzen. Beim VisualC++ 7.1 ist auch stdext::hash_map dabei.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1162352</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1162352</guid><dc:creator><![CDATA[Artchi]]></dc:creator><pubDate>Fri, 27 Oct 2006 07:36:10 GMT</pubDate></item><item><title><![CDATA[Reply to STL: Map - freien schluessel finden. on Fri, 27 Oct 2006 07:54:40 GMT]]></title><description><![CDATA[<p>Artchi schrieb:</p>
<blockquote>
<p>std::map ist definitiv keine Hashmap! Es ist eine einfacher pair-Container. Nicht mehr und nicht weniger. Das einzige besondere ist, das beim einfügen von pairs diese gleich an die richtige sortierte Stelle eingefügt werden.</p>
<p>Wer Hashmaps braucht, sollte auch die std::tr1::hash_map nutzen. Beim VisualC++ 7.1 ist auch stdext::hash_map dabei.</p>
</blockquote>
<p>&quot;Einfach&quot; ein Pair-Container ist das auch nicht. std::map nutzt einen Red-black Tree um die Daten zu halten. Daher auch das sortieren der Pairs.</p>
<p>grüße</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1162359</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1162359</guid><dc:creator><![CDATA[David_pb]]></dc:creator><pubDate>Fri, 27 Oct 2006 07:54:40 GMT</pubDate></item><item><title><![CDATA[Reply to STL: Map - freien schluessel finden. on Fri, 27 Oct 2006 08:06:24 GMT]]></title><description><![CDATA[<p>Dass es keine Hashmap sein kann sollte einem spätestens auffallen, wenn man versucht eine Hashfunktion vorzugeben und nur die Möglichkeit zur Übergabe eines Ordnungsprädikats vorfindet.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1162370</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1162370</guid><dc:creator><![CDATA[Bashar]]></dc:creator><pubDate>Fri, 27 Oct 2006 08:06:24 GMT</pubDate></item><item><title><![CDATA[Reply to STL: Map - freien schluessel finden. on Fri, 27 Oct 2006 08:18:40 GMT]]></title><description><![CDATA[<p>Bastel dir doch eine Klasse die eine laufende eindeutige nummer (eine Id) erzeugt. So hast du keine Duplikate und brauchst nicht jedesmal aufwändig zu prüfen ob eine Id bereits existiert.</p>
<p>Sowas wie:</p>
<pre><code class="language-cpp">class IdServer
{
public:
Idserver():id(0){};
getNextId(){return id++);
protected:
int id;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1162384</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1162384</guid><dc:creator><![CDATA[megaweber]]></dc:creator><pubDate>Fri, 27 Oct 2006 08:18:40 GMT</pubDate></item><item><title><![CDATA[Reply to STL: Map - freien schluessel finden. on Fri, 27 Oct 2006 08:32:06 GMT]]></title><description><![CDATA[<p>dann sollte die klasse singleton werden, sonst ist das ganze konzept von eindeutigkeit gefährdet.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1162391</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1162391</guid><dc:creator><![CDATA[thordk]]></dc:creator><pubDate>Fri, 27 Oct 2006 08:32:06 GMT</pubDate></item><item><title><![CDATA[Reply to STL: Map - freien schluessel finden. on Fri, 27 Oct 2006 08:35:25 GMT]]></title><description><![CDATA[<p>thordk schrieb:</p>
<blockquote>
<p>dann sollte die klasse singleton werden, sonst ist das ganze konzept von eindeutigkeit gefährdet.</p>
</blockquote>
<p>Nein, die IDs sollen nur innerhalb der Map eindeutig sein.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1162396</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1162396</guid><dc:creator><![CDATA[Bashar]]></dc:creator><pubDate>Fri, 27 Oct 2006 08:35:25 GMT</pubDate></item><item><title><![CDATA[Reply to STL: Map - freien schluessel finden. on Fri, 27 Oct 2006 12:41:03 GMT]]></title><description><![CDATA[<p>ich ging davon aus, dass die map von verschiedenen, unabhängigen methoden verwendet wird.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1162446</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1162446</guid><dc:creator><![CDATA[thordk]]></dc:creator><pubDate>Fri, 27 Oct 2006 12:41:03 GMT</pubDate></item><item><title><![CDATA[Reply to STL: Map - freien schluessel finden. on Fri, 27 Oct 2006 13:03:24 GMT]]></title><description><![CDATA[<p>Danke erst mal fuer die vielen Antworten. Ich glaube ich hab vergessen ein paar Randbedingungen zu erwaehnen. Die Mapping-Tabelle wird ueber eine sehr lange Zeit verwendet und ich bin sicher, dass es ueber kurz oder lang zu einem Ueberlauf der verwendeten Schluessel kommen wird und ich danach ueber einen &quot;fragmentieren&quot; Bereich nach freien ID's suchen muss. Eine sequentielle Suche ist daher nur beschraenkt moeglich.<br />
Die map wird hauptsaechlich dazu verwendete gespeicherte Objekte anhand ihrer ID schnellstmoeglich zu finden.<br />
An und fuer sich tut es ja. Ich war mir nur nicht sicher, ob es doch irgendeine &quot;schoenere&quot; Moeglichkeit gibt, nicht verwendete Schluessel aus der Map zu ziehen.</p>
<p>Gruss<br />
snuggl3s</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1162472</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1162472</guid><dc:creator><![CDATA[snuggl3s]]></dc:creator><pubDate>Fri, 27 Oct 2006 13:03:24 GMT</pubDate></item><item><title><![CDATA[Reply to STL: Map - freien schluessel finden. on Fri, 27 Oct 2006 18:19:20 GMT]]></title><description><![CDATA[<p>Eine extra Klasse statt der map wär vielleicht keine schlechte Idee.</p>
<pre><code class="language-cpp">class object_group
{
public:
  object_group( id_t min_id, id_t max_id );

  void insert_object( object* obj );
  void remove_object( object* obj );

private:
  id_t get_free_id() const;

private:
  typedef std::map&lt;id_t, object*&gt; id_map;
  id_map  objects_;
  typedef &lt;&lt;some_container&gt;&gt;  id_set;
  id_set  free_ids_;
};

object_group::object_group( id_t min_id, id_t max_id )
{
  // fill free_ids_
}

void insert_object( object* obj )
{
  id_t const id = get_free_id();
  obj-&gt;set_id(id);
  objects_.insert(id_map::value_type(id, obj));
  free_ids_.erase(id);
}

void remove_object( object* obj )
{
  objects_.erase(obj-&gt;get_id());
  free_ids_.insert(obj-&gt;get_id());
}
</code></pre>
<p>So als kleine Anregung.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1162769</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1162769</guid><dc:creator><![CDATA[finix]]></dc:creator><pubDate>Fri, 27 Oct 2006 18:19:20 GMT</pubDate></item><item><title><![CDATA[Reply to STL: Map - freien schluessel finden. on Fri, 27 Oct 2006 19:05:07 GMT]]></title><description><![CDATA[<p>snuggl3s schrieb:</p>
<blockquote>
<p>Danke erst mal fuer die vielen Antworten. Ich glaube ich hab vergessen ein paar Randbedingungen zu erwaehnen. Die Mapping-Tabelle wird ueber eine sehr lange Zeit verwendet und ich bin sicher, dass es ueber kurz oder lang zu einem Ueberlauf der verwendeten Schluessel kommen wird und ich danach ueber einen &quot;fragmentieren&quot; Bereich nach freien ID's suchen muss. Eine sequentielle Suche ist daher nur beschraenkt moeglich.</p>
</blockquote>
<p>dann würfle doch einfach. hast 32-bitter als IDs? und sagen wie mal 1000000 datensätze. dann haste beim würfeln ne cahce von 1 zu 4000, daß du nicht beim ersten wurf nen freie platz triffst. ist das nicht gut genug? und 1 zu 16000000, daß du auch beim zweiten mal nicht triffst.</p>
<blockquote>
<p>Die map wird hauptsaechlich dazu verwendete gespeicherte Objekte anhand ihrer ID schnellstmoeglich zu finden.</p>
</blockquote>
<p>dann nimm hash_map statt map.</p>
<blockquote>
<p>An und fuer sich tut es ja. Ich war mir nur nicht sicher, ob es doch irgendeine &quot;schoenere&quot; Moeglichkeit gibt, nicht verwendete Schluessel aus der Map zu ziehen.</p>
</blockquote>
<p>nicht aus der map. bei einer sehr vollen hashtable würde ich noch nen 4k großen stack (oder ringpuffer, falls ich freie IDs möglichst nicht sofort wiederverwenden will) der zuletzt freigegebenen IDs mitschleppen. bei 1 zu 4000 ist aber ein sicher benötigter plattenzugriff auf den stack vor dem vergeben der ID teurer, als einfach zu würfeln. sinds aber so viele zugriffe, daß der stack eh im ram bleibt, ist er schneller. worde hier aber keine überlegungen hinverschwenden, da O(1) in diesem fall nicht deutlich langsamer als O(1) ist und man eh erst duch ausmessen sehen kann, was besser ist und die messerei durchaus spät gemacht werden kann, weil du die ganze geschichte in eine klasse gewrapped hast, die eine hash_map enthält und deren schnittstelle zur verfügung stellt und dasüberhinaus die frage nach einer freien ID erlaubt (bzw ID als rückgabewert von &quot;ID insert(Data d)&quot; in einer überladung zu &quot;void insert(ID i,Data d)&quot; anbietet.)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1162797</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1162797</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Fri, 27 Oct 2006 19:05:07 GMT</pubDate></item></channel></rss>