<?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[Heap statt std::set&amp;lt;int&amp;gt; ?]]></title><description><![CDATA[<p>Hi</p>
<p>Ein std::set ist ja typischerweise als Baum implementiert. D.h. dass jeder Knoten drei zusätzliche Pointer abspeichern muss: Vater, linker Sohn, rechter Sohn. Das würde doch bedeuten dass im Fall von std::set&lt;int&gt; 3/4 des verwendeten Speichers (ich gehe mal davon aus dass sizeof(int) = sizeof(void*) ist) nur für Verweise verwendet wird. Wäre es da nicht sinnvoller für diesen Anwendungsfall einen Heap zu nehmen?</p>
<p>mfg</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/262759/heap-statt-std-set-lt-int-gt</link><generator>RSS for Node</generator><lastBuildDate>Sun, 06 Sep 2026 12:09:18 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/262759.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 10 Mar 2010 22:40:32 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Heap statt std::set&amp;lt;int&amp;gt; ? on Wed, 10 Mar 2010 22:40:32 GMT]]></title><description><![CDATA[<p>Hi</p>
<p>Ein std::set ist ja typischerweise als Baum implementiert. D.h. dass jeder Knoten drei zusätzliche Pointer abspeichern muss: Vater, linker Sohn, rechter Sohn. Das würde doch bedeuten dass im Fall von std::set&lt;int&gt; 3/4 des verwendeten Speichers (ich gehe mal davon aus dass sizeof(int) = sizeof(void*) ist) nur für Verweise verwendet wird. Wäre es da nicht sinnvoller für diesen Anwendungsfall einen Heap zu nehmen?</p>
<p>mfg</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1867243</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1867243</guid><dc:creator><![CDATA[rean]]></dc:creator><pubDate>Wed, 10 Mar 2010 22:40:32 GMT</pubDate></item><item><title><![CDATA[Reply to Heap statt std::set&amp;lt;int&amp;gt; ? on Wed, 10 Mar 2010 22:49:15 GMT]]></title><description><![CDATA[<p>Wie implementierst du denn die Datenstruktur Heap?</p>
<p>MfG SideWinder</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1867245</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1867245</guid><dc:creator><![CDATA[SideWinder]]></dc:creator><pubDate>Wed, 10 Mar 2010 22:49:15 GMT</pubDate></item><item><title><![CDATA[Reply to Heap statt std::set&amp;lt;int&amp;gt; ? on Wed, 10 Mar 2010 23:04:07 GMT]]></title><description><![CDATA[<p>Beispielsweise als min-Heap in einem std::vector.<br />
Der einzige Nachteil wäre eben dass ein neues Element in einen vollen vector nicht mehr mit logarithmischem sondern linearem Aufwand (Umkopieren der Elemente) eingefügt werden könnte.<br />
Dem könnte man zumindest ein wenig entgegenwirken indem man den vector beim Anwachsen gleich mal doppelt so groß macht, man hätte dann im Worst Case immernoch 50% weniger Speicher verwendet als ein set.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1867247</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1867247</guid><dc:creator><![CDATA[rean]]></dc:creator><pubDate>Wed, 10 Mar 2010 23:04:07 GMT</pubDate></item><item><title><![CDATA[Reply to Heap statt std::set&amp;lt;int&amp;gt; ? on Wed, 10 Mar 2010 23:11:14 GMT]]></title><description><![CDATA[<p>Naja du musst schon dein Ziel kennen. Ist es in deiner Anwendung wirklich der Speicherverbrauch der dich neckt? Meistens ist es imho besser die Geschwindigkeit im Auge zu behalten.</p>
<p>Wenn du aber dringend wenig Speicher brauchst dann speichert man x Elemente wohl am Besten in einem Array mit x Plätzen. Wenn du dann gleich 2*x reservieren willst fragt man sich ob nicht auch 4*x möglich gewesen wäre und du aber viel Geschwindigkeit dafür haben könntest....</p>
<p>MfG SideWinder</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1867250</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1867250</guid><dc:creator><![CDATA[SideWinder]]></dc:creator><pubDate>Wed, 10 Mar 2010 23:11:14 GMT</pubDate></item><item><title><![CDATA[Reply to Heap statt std::set&amp;lt;int&amp;gt; ? on Wed, 10 Mar 2010 23:20:47 GMT]]></title><description><![CDATA[<p>War auch eher eine theoretische Frage.<br />
Hab mir schon gedacht dass das nur in sehr speziellen Anwendungsfällen etwas bringen würde.<br />
Wobei der einzige der mir direkt einfallen würde der wäre dass man schon im voraus weiß wieviele Elemente man ungefähr haben wird.</p>
<p>Danke für den Input.</p>
<p>mfg<br />
rean</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1867255</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1867255</guid><dc:creator><![CDATA[rean]]></dc:creator><pubDate>Wed, 10 Mar 2010 23:20:47 GMT</pubDate></item><item><title><![CDATA[Reply to Heap statt std::set&amp;lt;int&amp;gt; ? on Wed, 10 Mar 2010 23:22:07 GMT]]></title><description><![CDATA[<p>rean schrieb:</p>
<blockquote>
<p>Der einzige Nachteil wäre eben dass ein neues Element in einen vollen vector nicht mehr mit logarithmischem sondern linearem Aufwand (Umkopieren der Elemente) eingefügt werden könnte.</p>
</blockquote>
<p>Wenn das kein Problem für dich ist, dann war std::set vielleicht von Anfang an die falsche Wahl für deine Anwendung.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1867256</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1867256</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Wed, 10 Mar 2010 23:22:07 GMT</pubDate></item><item><title><![CDATA[Reply to Heap statt std::set&amp;lt;int&amp;gt; ? on Thu, 11 Mar 2010 00:09:19 GMT]]></title><description><![CDATA[<p>Wenn man auf die Ordnung verzichten kannst und du große Mengen hast, dann kannst du vielleicht mit <code>unordered_set</code> eine kleine Ersparnis rausholen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1867276</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1867276</guid><dc:creator><![CDATA[rüdiger]]></dc:creator><pubDate>Thu, 11 Mar 2010 00:09:19 GMT</pubDate></item><item><title><![CDATA[Reply to Heap statt std::set&amp;lt;int&amp;gt; ? on Thu, 11 Mar 2010 00:40:14 GMT]]></title><description><![CDATA[<p>rean schrieb:</p>
<blockquote>
<p>Beispielsweise als min-Heap in einem std::vector.<br />
Der einzige Nachteil wäre eben dass ein neues Element in einen vollen vector nicht mehr mit logarithmischem sondern linearem Aufwand (Umkopieren der Elemente) eingefügt werden könnte.</p>
</blockquote>
<p>Da der Aufwand für das Umkopieren beim Vergrößern der Kapazität des Vektors aber umgekehrt proportional zur Häufigkeit der Kapazitätserhöhung steht, wächst ein Vektor im <em>Durchschnitt</em> mit konstantem Aufwand.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1867279</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1867279</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Thu, 11 Mar 2010 00:40:14 GMT</pubDate></item><item><title><![CDATA[Reply to Heap statt std::set&amp;lt;int&amp;gt; ? on Thu, 11 Mar 2010 02:03:11 GMT]]></title><description><![CDATA[<p>rean schrieb:</p>
<blockquote>
<p>Hi<br />
Ein std::set ist ja typischerweise als Baum implementiert.</p>
</blockquote>
<p>Ja.</p>
<p>rean schrieb:</p>
<blockquote>
<p>D.h. dass jeder Knoten drei zusätzliche Pointer abspeichern muss: Vater, linker Sohn, rechter Sohn.</p>
</blockquote>
<p>Der Vater-Zeiger ist bei vielen Bäumen gar nicht nötig, und wird nur gemacht, damit man auch Iteratoren anbieten kann.</p>
<p>rean schrieb:</p>
<blockquote>
<p>Das würde doch bedeuten dass im Fall von std::set&lt;int&gt; 3/4 des verwendeten Speichers (ich gehe mal davon aus dass sizeof(int) = sizeof(void*) ist) nur für Verweise verwendet wird.</p>
</blockquote>
<p>Jup.</p>
<p>rean schrieb:</p>
<blockquote>
<p>Wäre es da nicht sinnvoller für diesen Anwendungsfall einen Heap zu nehmen?</p>
</blockquote>
<p>Das hängt davon ab, was Du machen willst.</p>
<p>Brauchst Du einen Binärbaum mit Löschen an beliebiger Stelle und teuren Elementkopierungen, mußt Du auch mal sehen, daß die allocation granularity von new bei Dir vermutlich 32 Bytes ist. Weil bei Nutzdaten(4)+Verwaltungsdaten(3*4)=16 und 16+{uns unbekannte Verwaltungszeiger}(2*4)=24 und nu {immernochfrei}=8 man durch das Einsparen des Aufwärtszeigers keinen Speicher spart, ist die Diskussion schon recht wirr. Nicht unnötig und nicht schlecht, aber so voller Annahmen über Prozessoren und Standardsbibliotheksimplementierungen, daß es einem ganz schwummrig wird.</p>
<p>Brauchst Du nur einen Heap (PriorityQueue), kannst Du die Daten als Array ablegen und hast 0 Speicheroverhead.</p>
<p>Ich benutze praktisch nie std::set oder std::map. Fast immr brauche ich eigentlich einen Heap oder eine HashTable. Deswegen habe ich so zwei Klassen auf der Platte liegen, in bestimmt asig schlechter Implementierung, aber naja, man muß sich keine Mühe beim Implementieren geben, um eine nicht angemessene Datenstruktur zu outperformen, indem man eine angemessene nimmt.</p>
<p>Heap-Dinge hat die stl dabei. <a href="http://www.cplusplus.com/reference/algorithm/pop_heap/" rel="nofollow">http://www.cplusplus.com/reference/algorithm/pop_heap/</a> Spaßigeweise nicht als Klasse, aber sich ne Klasse drumzuschrauben kostet da nur Minuten.</p>
<p>Hashtables sind als unordered_* bei Deinem Compiler dabei. Sie sind riskant. Ist Die Hashfunktion (, die Du ja normalerweise selber angibst,) doof, verfuckt die Hashtable und wird langsam wie Popo. Oder noch langsamer.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1867289</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1867289</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Thu, 11 Mar 2010 02:03:11 GMT</pubDate></item><item><title><![CDATA[Reply to Heap statt std::set&amp;lt;int&amp;gt; ? on Thu, 11 Mar 2010 13:02:32 GMT]]></title><description><![CDATA[<p>Da es anscheinend noch keiner erwähnt hat:</p>
<p>In einem Heap kann man nicht effizient suchen (O(n)). In einem std::set schon (O(log n)).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1867477</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1867477</guid><dc:creator><![CDATA[life]]></dc:creator><pubDate>Thu, 11 Mar 2010 13:02:32 GMT</pubDate></item></channel></rss>