<?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[sind stl-container in tiefer Schachtelung noch effizient?]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich möchte jetzt keine Diskussion darüber anstoßen, dass die STL performanter ist als alles, was der durchschnittliche Hobby-C++-Hacker schreiben kann, aber ich habe trotzdem eine Frage oder besser gesagt Bedenken bezüglich der Effizienz.</p>
<p>Durch das Template-Programmieren wird alles so bequem, dass man gar nicht mehr richtig merkt, auf was für komplexen Datentypen man mittlerweile operiert.</p>
<p>Bei einer template-spezifizierung ist mir jetzt aufgefallen, dass ich in einem Anwendungsfall mit einem</p>
<pre><code class="language-cpp">using std::vector;
using std::queue;
using std::pair;

queue&lt;pair&lt;unsigned char, vector&lt;float&gt; &gt; &gt;
</code></pre>
<p>arbeite, also eine queue abarbeite, die aus pairs von chars und vectoren von floats besteht.</p>
<p>Sind so tiefe typschachtelung in &quot;professionellem C++&quot; eigentlich die Regel oder ist das ne extreme Ausnahme??<br />
Und ist sowas sehr langsam oder ist die STL wirklich so gut, dass man sich auch bei solchen verschachtelungen keinen Kopf machen muss?</p>
<p>Gruß,<br />
Phil</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/230829/sind-stl-container-in-tiefer-schachtelung-noch-effizient</link><generator>RSS for Node</generator><lastBuildDate>Sun, 27 Sep 2026 03:34:08 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/230829.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 02 Jan 2009 15:59:26 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to sind stl-container in tiefer Schachtelung noch effizient? on Fri, 02 Jan 2009 16:02:59 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich möchte jetzt keine Diskussion darüber anstoßen, dass die STL performanter ist als alles, was der durchschnittliche Hobby-C++-Hacker schreiben kann, aber ich habe trotzdem eine Frage oder besser gesagt Bedenken bezüglich der Effizienz.</p>
<p>Durch das Template-Programmieren wird alles so bequem, dass man gar nicht mehr richtig merkt, auf was für komplexen Datentypen man mittlerweile operiert.</p>
<p>Bei einer template-spezifizierung ist mir jetzt aufgefallen, dass ich in einem Anwendungsfall mit einem</p>
<pre><code class="language-cpp">using std::vector;
using std::queue;
using std::pair;

queue&lt;pair&lt;unsigned char, vector&lt;float&gt; &gt; &gt;
</code></pre>
<p>arbeite, also eine queue abarbeite, die aus pairs von chars und vectoren von floats besteht.</p>
<p>Sind so tiefe typschachtelung in &quot;professionellem C++&quot; eigentlich die Regel oder ist das ne extreme Ausnahme??<br />
Und ist sowas sehr langsam oder ist die STL wirklich so gut, dass man sich auch bei solchen verschachtelungen keinen Kopf machen muss?</p>
<p>Gruß,<br />
Phil</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1638424</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1638424</guid><dc:creator><![CDATA[PhilippM]]></dc:creator><pubDate>Fri, 02 Jan 2009 16:02:59 GMT</pubDate></item><item><title><![CDATA[Reply to sind stl-container in tiefer Schachtelung noch effizient? on Fri, 02 Jan 2009 16:20:45 GMT]]></title><description><![CDATA[<p>PhilippM schrieb:</p>
<blockquote>
<p>ich möchte jetzt keine Diskussion darüber anstoßen, dass die STL performanter ist als alles, was der durchschnittliche Hobby-C++-Hacker schreiben kann, aber ich habe trotzdem eine Frage oder besser gesagt Bedenken bezüglich der Effizienz.</p>
</blockquote>
<p>Soweit mir bekannt ist, ist die STL, bzw. die Standardbibliothek, so gehalten, dass man sie sehr allgemein einsetzen kann. Für spezielle Aufgaben, kann man meistens die Sache performanter machen. Aber da muss man natürlich schon ein wenig Wissen mitbringen, was aber auch ein Hobby C++ Programmierer haben kann.</p>
<p>PhilippM schrieb:</p>
<blockquote>
<p>Sind so tiefe typschachtelung in &quot;professionellem C++&quot; eigentlich die Regel oder ist das ne extreme Ausnahme??</p>
</blockquote>
<p>Ich hoffe du meinst das &quot;tiefe&quot; als Witz? Programmier mal mit Boost.Spirit, der Boost.MPL oder allgemein in der Template-Metaprogrammierung. Da erreichst du tiefe Verschachtelungen.</p>
<p>Ob sie eine Ausnahme sind ist eine schwere Frage, da es ganz darauf ankommt, wie man programmiert. Ein Templatefreak macht sehr viele und tiefe Typschachtelungen, ein anderer weniger <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>
<p>PhilippM schrieb:</p>
<blockquote>
<p>Und ist sowas sehr langsam oder ist die STL wirklich so gut, dass man sich auch bei solchen verschachtelungen keinen Kopf machen muss?</p>
</blockquote>
<p>Die Verschachtelung von Templates führt in erster Linie dazu, dass dein Kompiler in die Knie gezwungen wird. Allerdings noch nicht bei einem so einfachen Typen.<br />
Langsamer wird es höchstens dadurch, dass der <code>vector&lt;float&gt;</code> kopiert werden muss. Wenn die Implementation aber gut ist, dann wird wohl ein <code>swap</code> eingesetzt um die Elemente nach vorne zu holen, wodurch keine wesentliche Kopie von nöten ist. Bei einer <code>std::list</code> wird es sogar nur ein umhängen von Zeigern sein.</p>
<p>Es ist daher eher unwahrscheinlich, dass der Code irgendwie langsamer werden wird. Vor allem ist die Frage, wie du es sonst lösen möchtest? Wenn du diesen Typ als Klasse implementierst, kommt es auf das gleiche raus.<br />
Wenn du womöglich Vererbung einsetzt, dann kann es sogar langsamer werden, als die Templatelösung.</p>
<p>Ich würde mir darum keinen Kopf machen. Erst wenn du später merkst, dass du hier einen Performanceverlust hast, zum Beispiel dank einem Profiler, dann kannst du optimieren. Aber ich denke du wirst die Performance eher an anderer Stelle verlieren und der Bereich wird hervorragend laufen <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>
<p>Grüssli</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1638438</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1638438</guid><dc:creator><![CDATA[Dravere]]></dc:creator><pubDate>Fri, 02 Jan 2009 16:20:45 GMT</pubDate></item><item><title><![CDATA[Reply to sind stl-container in tiefer Schachtelung noch effizient? on Fri, 02 Jan 2009 16:26:18 GMT]]></title><description><![CDATA[<p>PhilippM schrieb:</p>
<blockquote>
<p>queue&lt;pair&lt;unsigned char, vector&lt;float&gt; &gt; &gt;</p>
</blockquote>
<p>das ist super.</p>
<p>PhilippM schrieb:</p>
<blockquote>
<p>Sind so tiefe typschachtelung in &quot;professionellem C++&quot; eigentlich die Regel oder ist das ne extreme Ausnahme??</p>
</blockquote>
<p>die ausnahme. kommt aber manchmal vor.</p>
<p>PhilippM schrieb:</p>
<blockquote>
<p>Und ist sowas sehr langsam oder ist die STL wirklich so gut, dass man sich auch bei solchen verschachtelungen keinen Kopf machen muss?</p>
</blockquote>
<p>bitte mach dir einen kopf.</p>
<p>volkard schrieb:</p>
<blockquote>
<p>vector&lt;pair&lt;unsigned char, queue&lt;float&gt; &gt; &gt;</p>
</blockquote>
<p>das ist kacke.</p>
<p>wenn hier der vector wachsen muß, dann kopiert er tausende von queues, die wiederum innendrin schleifen laufen haben, die kopieren, dazu pro queue-block, der daten bekommen hat, einmal new und einmal delete. das ist eher nicht lecker.<br />
bei deiner queue&lt;pair&lt;unsigned char, vector&lt;float&gt; &gt; &gt; hingegen passiert beim wachstum gar nichts schlimmees, die vectoren müssen niemals kopiert werden.</p>
<p>demnächst mit rvalue references entschärft sich die sache und du kannst dann eigentlich nicht mehr aus versehen eine langsame datenstruktur aus anderen zusammenbasteln, vermute ich.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1638440</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1638440</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Fri, 02 Jan 2009 16:26:18 GMT</pubDate></item><item><title><![CDATA[Reply to sind stl-container in tiefer Schachtelung noch effizient? on Fri, 02 Jan 2009 16:31:26 GMT]]></title><description><![CDATA[<p>Dravere schrieb:</p>
<blockquote>
<p>Langsamer wird es höchstens dadurch, dass der <code>vector&lt;float&gt;</code> kopiert werden muss. Wenn die Implementation aber gut ist, dann wird wohl ein <code>swap</code> eingesetzt um die Elemente nach vorne zu holen, wodurch keine wesentliche Kopie von nöten ist. Bei einer <code>std::list</code> wird es sogar nur ein umhängen von Zeigern sein.</p>
</blockquote>
<p>Wie kann man denn mit swap kopieren <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1638445</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1638445</guid><dc:creator><![CDATA[Badestrand]]></dc:creator><pubDate>Fri, 02 Jan 2009 16:31:26 GMT</pubDate></item><item><title><![CDATA[Reply to sind stl-container in tiefer Schachtelung noch effizient? on Fri, 02 Jan 2009 16:47:49 GMT]]></title><description><![CDATA[<p>Badestrand schrieb:</p>
<blockquote>
<p>Wie kann man denn mit swap kopieren <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /></p>
</blockquote>
<p>Das lustige an der Sache ist doch, dass man das alte Objekt nach dem Kopieren nicht mehr braucht, deshalb kann man ein <code>swap</code> nehmen.</p>
<p>Nehmen wir als triviales dummes Beispiel ein Array aus 4 Elementen:</p>
<pre><code class="language-cpp">| 1 | 2 | 3 | 4 |

Wir vernichten das erste Element.
| x | 2 | 3 | 4 | (x = zerstörtes Element)

Grundsätzlich muss nun 2 -&gt; x, 3 -&gt; 2, 4 -&gt; 3 kopiert werden.
| 2 | 2 | 3 | 4 |
| 2 | 3 | 3 | 4 |
| 2 | 3 | 4 | 4 |

Statt einer Kopie, könnten wir aber auch swappen.
x mit 2, x mit 3, x mit 4 (nacheinander)
| 2 | x | 3 | 4 |
| 2 | 3 | x | 4 |
| 2 | 3 | 4 | x |
</code></pre>
<p>Prinzip klar?<br />
Für einen <code>std::vector&lt;float&gt;</code> könnte so ein durchswappen sehr optimal sein, da intern womöglich nur Grösse und Zeiger getauscht werden müssten. Bei einer Kopie müssten dagegen immer alle Elemente auch kopiert werden. Von jeweiliger Speicheranforderung und Freigabe gar nicht zu sprechen.</p>
<p>Grüssli</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1638450</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1638450</guid><dc:creator><![CDATA[Dravere]]></dc:creator><pubDate>Fri, 02 Jan 2009 16:47:49 GMT</pubDate></item><item><title><![CDATA[Reply to sind stl-container in tiefer Schachtelung noch effizient? on Fri, 02 Jan 2009 17:26:46 GMT]]></title><description><![CDATA[<p>Oha, ok, ich hatte mir irgendwie was anderes drunter vorgestellt <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1638469</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1638469</guid><dc:creator><![CDATA[Badestrand]]></dc:creator><pubDate>Fri, 02 Jan 2009 17:26:46 GMT</pubDate></item><item><title><![CDATA[Reply to sind stl-container in tiefer Schachtelung noch effizient? on Fri, 02 Jan 2009 22:01:31 GMT]]></title><description><![CDATA[<p>Mit C++0x wird das alles (deutlich) besser <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/1638581</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1638581</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Fri, 02 Jan 2009 22:01:31 GMT</pubDate></item><item><title><![CDATA[Reply to sind stl-container in tiefer Schachtelung noch effizient? on Sat, 03 Jan 2009 01:01:44 GMT]]></title><description><![CDATA[<p>Hi volkard,</p>
<p>volkard schrieb:</p>
<blockquote>
<p>PhilippM schrieb:</p>
<blockquote>
<p>vector&lt;pair&lt;unsigned char, queue&lt;float&gt; &gt; &gt;</p>
</blockquote>
<p>das ist kacke.</p>
<p>wenn hier der vector wachsen muß, dann kopiert er tausende von queues, die wiederum innendrin schleifen laufen haben, die kopieren, dazu pro queue-block, der daten bekommen hat, einmal new und einmal delete. das ist eher nicht lecker.</p>
</blockquote>
<p>Deine Bedenken kann ich sehr gut verstehen.</p>
<p>Ich bin zwar nur C++-Hobby-Programmierer, aber wenn ich so ein Konstrukt<br />
brauchen würde, dann würde ich es auch so verwenden.</p>
<p>Dazu würde ich std::swap für den Datentyp pair&lt;unsigned char, queue&lt;float&gt; &gt;<br />
implementieren um somit das kopieren zu verhindern.</p>
<p>Würde das nicht den von mir erhofften Erfolg zur Folge haben?</p>
<p>Gruß,<br />
CSpille</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1638623</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1638623</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Sat, 03 Jan 2009 01:01:44 GMT</pubDate></item><item><title><![CDATA[Reply to sind stl-container in tiefer Schachtelung noch effizient? on Sat, 03 Jan 2009 01:59:40 GMT]]></title><description><![CDATA[<p>CSpille schrieb:</p>
<blockquote>
<p>Dazu würde ich std::swap für den Datentyp pair&lt;unsigned char, queue&lt;float&gt; &gt;<br />
implementieren um somit das kopieren zu verhindern.</p>
<p>Würde das nicht den von mir erhofften Erfolg zur Folge haben?</p>
</blockquote>
<p>nein, eher nicht. Draveres swap ist bei Draveres beispiel ok, nicht aber beim wachsen. an sich geht er ja in die richtige richtung, da wollte ich nicht widersprechen.<br />
beim wachsen passiert was anderes.<br />
man hat zum beispiel einen vector mit 1000 elementen. und der ist voll. push_back löst ein wachsen aus. dabei wird an einem neuen ort im ram neuer speicher für 2000 elemente angelegt. dann werden die 1000 bisherigen elemente in den neuen speicher kopiert. mit dem kopierkonstruktor. falls eine exception fliegt beim 567. element, werden die 566 kopierten elemete halt schnell wieder destruiert.<br />
nichsdestotrotz würde was einigermaßen schnelles mit swap gehen. man prüft vor jedem push_back selber, ob noch platz ist. wachsenlassen ginge dann mit: neuen vector mit 1000 leeren queues anlegen. die 1000 elemens vom alten und neuen swappen. dann die vectoren selbst swappen. und den kleinen löschen (fallenlassen). ein vector ist niicht so kompliziert, daß man nicht einfach eine eigene klasse bauen kann, die das macht, statt den std::vector in solcher weise von außen zu managen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1638637</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1638637</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Sat, 03 Jan 2009 01:59:40 GMT</pubDate></item><item><title><![CDATA[Reply to sind stl-container in tiefer Schachtelung noch effizient? on Sat, 03 Jan 2009 02:05:00 GMT]]></title><description><![CDATA[<p>CSpille schrieb:</p>
<blockquote>
<p>Ich bin zwar nur C++-Hobby-Programmierer, aber wenn ich so ein Konstrukt<br />
brauchen würde, dann würde ich es auch so verwenden.</p>
</blockquote>
<p>vielleicht würde ich mich einmischen und die sagen, daß du das eben nicht brauchen würdest.</p>
<p>nimm doch einfach statt<br />
vector&lt;pair&lt;unsigned char, queue&lt;float&gt; &gt; &gt;<br />
eine<br />
queue&lt;pair&lt;unsigned char, queue&lt;float&gt; &gt; &gt;</p>
<p>die zugriffszeiten der äußeren queue sind immernoch lecker schnell und die leichte verlangsamung gegenüber vector wird nochmal relativiert, weil die zugriffszeiten der inneren queue noch dazukommen und die äußere queue kann wachsen, ohne was zu kopieren. queues haben doch nen operator[] mit der zeitkomplexität O(1), wenn ich mich recht erinnere.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1638639</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1638639</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Sat, 03 Jan 2009 02:05:00 GMT</pubDate></item><item><title><![CDATA[Reply to sind stl-container in tiefer Schachtelung noch effizient? on Sat, 03 Jan 2009 02:50:35 GMT]]></title><description><![CDATA[<p>Hi volkard,</p>
<p>vielen Dank für deine nächtliche Antwort. Hab gerade völlig vergessen,<br />
dass der Copy-Konstruktor aufgerufen wird. Hab durch die swap-Diskussion<br />
gedacht es würde der leere Konstruktor aufgerufen und ein swap. ^^<br />
Naja, ist halt spät <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
<p>Die Datenstruktur, die ich (unbedingt) verwenden wollte, war unabhängig<br />
von dem Beispiel. Klar kann ich in diesem Beispiel eine sinnvollere verwenden.</p>
<p>volkard schrieb:</p>
<blockquote>
<p>queues haben doch nen operator[] mit der zeitkomplexität O(1)</p>
</blockquote>
<p>Wirklich? Ich dachte es war O(n)</p>
<p>Dann bleibt als einzige Copy-Prevention (ohne explizite push_back-Behandlung unter<br />
Verwendung der STL) wohl doch nur<br />
vector&lt;pair&lt;unsigned char, queue&lt;float&gt;* &gt; &gt;<br />
bzw.<br />
vector&lt;pair&lt;unsigned char, queue&lt;float&gt; &gt;* &gt;<br />
EDIT: Wenn man also einen Vektor verwenden möchte (ohne Betrachtung alternativer Strukturen)...</p>
<p>Gruß,<br />
CSpille</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1638642</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1638642</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Sat, 03 Jan 2009 02:50:35 GMT</pubDate></item><item><title><![CDATA[Reply to sind stl-container in tiefer Schachtelung noch effizient? on Sat, 03 Jan 2009 03:27:03 GMT]]></title><description><![CDATA[<p>CSpille schrieb:</p>
<blockquote>
<p>volkard schrieb:</p>
<blockquote>
<p>queues haben doch nen operator[] mit der zeitkomplexität O(1)</p>
</blockquote>
<p>Wirklich? Ich dachte es war O(n)</p>
</blockquote>
<p>queue ist nur ein adapter, drunter liegt normalerweise deque.<br />
ich meinte natürlich deque.<br />
und der op[] hat dabei O(1).<br />
<a href="http://www.cplusplus.com/reference/stl/deque/operator%5B%5D.html" rel="nofollow">http://www.cplusplus.com/reference/stl/deque/operator[].html</a></p>
<p>die deque ist nämlich nicht eine doppelt verkettete liste, sondern besteht aus lauter (zum beispiel) 4096 bytes großen seiten, die vollgemacht werden und beim wachsen müssen die seiten nicht umkopiert werden. für den op[] gibt es eine zusätzliche indirektion, also nix schlimmes. und du kannst sie weitgehend verwenden, ohne dran zu denken, daß sie gar kein vector ist.</p>
<blockquote>
<p>Dann bleibt als einzige Copy-Prevention (ohne explizite push_back-Behandlung unter<br />
Verwendung der STL) wohl doch nur<br />
vector&lt;pair&lt;unsigned char, queue&lt;float&gt;* &gt; &gt;<br />
bzw.<br />
vector&lt;pair&lt;unsigned char, queue&lt;float&gt; &gt;* &gt;<br />
EDIT: Wenn man also einen Vektor verwenden möchte (ohne Betrachtung alternativer Strukturen)...</p>
</blockquote>
<p>an die lösung hab ich auch gedacht, die ist aber nicht gerade exceptionsicher. nimmr man dann smart pointers rein, wird's am ende vielleicht langsamer als die deque und ist vor allem viel schlechter zu bedienen. man müßte ja die ganzen zeiger mit new bestücken.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1638645</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1638645</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Sat, 03 Jan 2009 03:27:03 GMT</pubDate></item><item><title><![CDATA[Reply to sind stl-container in tiefer Schachtelung noch effizient? on Sat, 03 Jan 2009 03:33:36 GMT]]></title><description><![CDATA[<p>volkard schrieb:</p>
<blockquote>
<p>man hat zum beispiel einen vector mit 1000 elementen. und der ist voll. push_back löst ein wachsen aus. dabei wird an einem neuen ort im ram neuer speicher für 2000 elemente angelegt. dann werden die 1000 bisherigen elemente in den neuen speicher kopiert. mit dem kopierkonstruktor. falls eine exception fliegt beim 567. element, werden die 566 kopierten elemete halt schnell wieder destruiert.</p>
</blockquote>
<p>Sagt der Standard denn etwas dazu, dass hier der Kopierkonstruktor verwendet werden muss? Ich dachte es wäre auch korrekt, wenn die Implementierung einen swap der einzelnen Elemente ausführt. Was zur Konstruktion und Destruktion von nur sehr kleinen Objekten führt. Also grundsätzlich das, was du sagst, was man selber machen müsse.</p>
<p>Ich würde das grösste Problem eher in <code>std::queue</code> sehen. Queue ist nur ein Adapter, welcher keinen Zugriff auf den inneren Container gibt. Soweit mir bekannt ist, ist auch kein swap für <code>std::queue</code> vorhanden. Man muss diese Struktur somit immer kopieren.<br />
(Bin im übrigen sowieso kein Fan von diesen Adaptern, habe den Vorteil noch nicht entdecken können)</p>
<p>Grüssli</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1638647</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1638647</guid><dc:creator><![CDATA[Dravere]]></dc:creator><pubDate>Sat, 03 Jan 2009 03:33:36 GMT</pubDate></item><item><title><![CDATA[Reply to sind stl-container in tiefer Schachtelung noch effizient? on Sat, 03 Jan 2009 03:48:14 GMT]]></title><description><![CDATA[<p>Dravere schrieb:</p>
<blockquote>
<p>Sagt der Standard denn etwas dazu, dass hier der Kopierkonstruktor verwendet werden muss?</p>
</blockquote>
<p>nein.</p>
<blockquote>
<p>Ich dachte es wäre auch korrekt, wenn die Implementierung einen swap der einzelnen Elemente ausführt. Was zur Konstruktion und Destruktion von nur sehr kleinen Objekten führt. Also grundsätzlich das, was du sagst, was man selber machen müsse.</p>
</blockquote>
<p>und die version mit swap ist für PODs großer unfug. der vector müßte mit extrem spaßiger template-metaprogrammierung feststellen, ob die verwaltete klasse swap anbietet und ob das zu nehmen klug wäre. also in diesem falls feststellen: std::pair kann geswapped werden, ob's klug ist hängt aber davon ab, ob die inneren typen das mögen. drinnen sind a) unsigned char. der char mag es nicht. b) queue&lt;float&gt;. die mag es. die queue kann normalerweise viel mehr gewinnen als der bool verliert. also nehmen wir mal die swap-version.<br />
ich bin sicher, daß es noch keine implemetierung der stl gibt, die sowas macht. und ich vermute, die wird es auch nie geben. sich die richtigen datenstrukturen rauszusuchen, bzw wie bei alexandrescu dem vector die grow-with-swap-policy mitzugeben, ist aufgabe des programmierers.</p>
<blockquote>
<p>Ich würde das grösste Problem eher in <code>std::queue</code> sehen. Queue ist nur ein Adapter, welcher keinen Zugriff auf den inneren Container gibt. Soweit mir bekannt ist, ist auch kein swap für <code>std::queue</code> vorhanden. Man muss diese Struktur somit immer kopieren.<br />
(Bin im übrigen sowieso kein Fan von diesen Adaptern, habe den Vorteil noch nicht entdecken können)</p>
</blockquote>
<p>ich sehe da auch eher keinen vortiel. ich meinte auch die deque. deque hat swap. die queue nicht mehr, vielleicht um mehr innere container für diesen adapter zu erlauben? da wäre SFINAE wohl die wahl gewesen, und zu sagen, daß queue dann swap hat, wenn der innere container swap hat. aber das gab es damals noch nicht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1638652</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1638652</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Sat, 03 Jan 2009 03:48:14 GMT</pubDate></item><item><title><![CDATA[Reply to sind stl-container in tiefer Schachtelung noch effizient? on Sat, 03 Jan 2009 03:51:47 GMT]]></title><description><![CDATA[<p>volkard schrieb:</p>
<blockquote>
<p>die queue nicht mehr, vielleicht um mehr innere container für diesen adapter zu erlauben? da wäre SFINAE wohl die wahl gewesen, und zu sagen, daß queue dann swap hat, wenn der innere container swap hat. aber das gab es damals noch nicht.</p>
</blockquote>
<p>was hat das mit SFINAE zu tun?<br />
diese dinge löst man doch normalerweise dadurch dass man die funktion einfach implementiert -- solange sie nicht instanziert wird ist alles OK. und wenn man versucht sie zu instanzieren, dann sieht man eh ob es klappt oder nicht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1638655</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1638655</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Sat, 03 Jan 2009 03:51:47 GMT</pubDate></item><item><title><![CDATA[Reply to sind stl-container in tiefer Schachtelung noch effizient? on Sat, 03 Jan 2009 04:00:20 GMT]]></title><description><![CDATA[<p>hustbaer schrieb:</p>
<blockquote>
<p>was hat das mit SFINAE zu tun?<br />
diese dinge löst man doch normalerweise dadurch dass man die funktion einfach implementiert</p>
</blockquote>
<p>stimmt. das hab ich gerade verwechselt mit einem eigenen globalen swap, das mit SFINAE geschaut hat, ob die klasse eine memberswap hat und das gegebenenfalls benutzt und anderenfalls nur dreieckstausch macht. jetzt frage ich mich, warum die queue kein swap hat.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1638657</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1638657</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Sat, 03 Jan 2009 04:00:20 GMT</pubDate></item><item><title><![CDATA[Reply to sind stl-container in tiefer Schachtelung noch effizient? on Sat, 03 Jan 2009 04:09:18 GMT]]></title><description><![CDATA[<p>volkard schrieb:</p>
<blockquote>
<p>und die version mit swap ist für PODs großer unfug.</p>
</blockquote>
<p>Hmmm, stimmt. Hab die PODs vergessen. Gibt es keine einfachere Lösung, um auch die zu berücksichtigen? *gähnende müde leere im Kopf hat*<br />
Naja, das überleg ich mir nicht mehr um 5 Uhr morgens <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
<p>volkard schrieb:</p>
<blockquote>
<p>jetzt frage ich mich, warum die queue kein swap hat.</p>
</blockquote>
<p>Wenn du schon dabei bist, frag gleich mal nach, wieso <code>std::stack</code> und <code>std::priority_queue</code> kein swap haben. Und ein clear wäre auch nicht schlecht. Und noch ein paar andere Dinge. Wozu sind die Dinger überhaupt gut?</p>
<p>Grüssli</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1638660</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1638660</guid><dc:creator><![CDATA[Dravere]]></dc:creator><pubDate>Sat, 03 Jan 2009 04:09:18 GMT</pubDate></item><item><title><![CDATA[Reply to sind stl-container in tiefer Schachtelung noch effizient? on Sat, 03 Jan 2009 04:42:01 GMT]]></title><description><![CDATA[<p>Dravere schrieb:</p>
<blockquote>
<p>volkard schrieb:</p>
<blockquote>
<p>und die version mit swap ist für PODs großer unfug.</p>
</blockquote>
<p>Hmmm, stimmt. Hab die PODs vergessen. Gibt es keine einfachere Lösung, um auch die zu berücksichtigen?</p>
</blockquote>
<p>ich sehe keine. aber meiner meinung nach sollte c++ das nicht tun aus ideologischen gründen (sie stehen nicht im standard). c++ darf nicht erkennen, daß ich bubble-sort gebaut habe und es klammheimlich durch intro-sort ersetzen. es kann nämlich sein, daß ich die ausgefallene datenlage habe, daß ich mein telefonbuch sortiert auf platte und im ram halte und sort nach jedem neuladen aufrufe und mit dem benutzer vereinbart habe, daß er nur einträge löschen darf und neue einträge hinten an die datei anhängen darf. da ist bubblesort einfach schneller als die ganzen profi-alternativen. beim<br />
vector&lt;pair&lt;unsigned char, queue&lt;float&gt; &gt; &gt;<br />
mags ja klar sein, aber beim<br />
vector&lt;pair&lt;unsigned char[8192], queue&lt;float&gt; &gt; &gt;<br />
muß einfach der programmierer entscheiden, ob die queues gewöhnlich sehr wenige elemente haben und der POD bestimmt oder ob die queues gewöhnlich sehr viele elemente haben und swap gut ist.<br />
darüberhinaus ist es nicht gut, bloß auf die verbrauchte zeit zu achten, manchmal ist eine langsame lösung besser, weil sie nicht ruckelt. deswegen ist die globale objektliste im 3d-spiel eine verkettete liste, die 150-mal so viel rechenzeit frißt wie der entsprechende vector. aber die liste ruckelt nicht. wenn der vector von 1000000 elementen auf 2000000 mio springt, dann steht der rechner für ein halbes sekündchen und der player ist mausetot. das mag er nicht. lieber gibt er 50€ mehr für hardware aus und nimmt die verkettete liste. hingegen muß im backup-brogramm der vector genommen werden. da will ich ein paar minuten schneller sein und ein ruckeln ist mir egal.<br />
ich möchte keine sprache benutzen, die für mich entscheidet, ob mein programm eher ein backup-programm oder ein spiel ist. ok, wie kopiert werden soll, darf sie entscheiden, solange ich noch ein vetorecht behalte.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1638663</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1638663</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Sat, 03 Jan 2009 04:42:01 GMT</pubDate></item></channel></rss>