<?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[stream oder +=]]></title><description><![CDATA[<p>was ist besser:</p>
<pre><code>while(lange) {
 ss &lt;&lt; ein_char;
}
str = ss.str();
</code></pre>
<p>oder</p>
<pre><code>while(lange) {
 str += ein_char;
}
</code></pre>
<p>warum?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/317914/stream-oder</link><generator>RSS for Node</generator><lastBuildDate>Mon, 27 Jul 2026 21:47:15 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/317914.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 24 Jun 2013 16:16:22 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to stream oder += on Mon, 24 Jun 2013 16:16:22 GMT]]></title><description><![CDATA[<p>was ist besser:</p>
<pre><code>while(lange) {
 ss &lt;&lt; ein_char;
}
str = ss.str();
</code></pre>
<p>oder</p>
<pre><code>while(lange) {
 str += ein_char;
}
</code></pre>
<p>warum?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2333965</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2333965</guid><dc:creator><![CDATA[falg]]></dc:creator><pubDate>Mon, 24 Jun 2013 16:16:22 GMT</pubDate></item><item><title><![CDATA[Reply to stream oder += on Mon, 24 Jun 2013 16:25:13 GMT]]></title><description><![CDATA[<p>Also wer einen std::string mittels ostringstream zusammensetzt... bei dem läuft was schief. ostringstream wird schon oft genug missbraucht, wir wollen ihn jetzt nicht auch noch für sowas missbrauchen... Ich denke die Anwort ist eindeutig.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2333969</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2333969</guid><dc:creator><![CDATA[out]]></dc:creator><pubDate>Mon, 24 Jun 2013 16:25:13 GMT</pubDate></item><item><title><![CDATA[Reply to stream oder += on Mon, 24 Jun 2013 16:34:14 GMT]]></title><description><![CDATA[<p>Ein std::string ist ein Spezialist für die Arbeit mit Zeichenketten im Speicher. (Also auch das anhängen)<br />
Die Streams hingegen sind generalisiert und bieten theoretischen Support alle Eingabedaten per Brieftaube nach Südafrika zu senden. Wer ist jetzt wohl besser dafür geeignet?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2333972</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2333972</guid><dc:creator><![CDATA[Ethon]]></dc:creator><pubDate>Mon, 24 Jun 2013 16:34:14 GMT</pubDate></item><item><title><![CDATA[Reply to stream oder += on Mon, 24 Jun 2013 16:34:37 GMT]]></title><description><![CDATA[<p>std::vector&lt;char&gt;</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2333973</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2333973</guid><dc:creator><![CDATA[ghjghjghj]]></dc:creator><pubDate>Mon, 24 Jun 2013 16:34:37 GMT</pubDate></item><item><title><![CDATA[Reply to stream oder += on Mon, 24 Jun 2013 16:35:15 GMT]]></title><description><![CDATA[<p>@out<br />
Bist du sicher dass <code>std::string::operator +=</code> ähnliche Komplexitätsgarantien gibt wie <code>std::vector::push_back</code> ?<br />
Ich bin mir nämlich fast sicher dass es nicht so ist.</p>
<p>D.h. die <code>std::string::operator +=</code> Variante könnte im schlimmsten Fall für jedes einzelne <code>+=</code> eine Reallocation machen.</p>
<p>---</p>
<p>Wenn man die finale Länge des Strings vorab kennt ist es kein Problem. In dem Fall einfach vorher <code>str.reserve()</code> machen und dann mit <code>+=</code> anhängen.</p>
<p>Ohne <code>str.reserve()</code> finde ich deine Aussage aber etwas gewagt.</p>
<p>In den meisten Fällen wird es egal sein, aber dort wo es nicht egal ist würde ich schon wissen wollen was da genau passiert.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2333974</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2333974</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Mon, 24 Jun 2013 16:35:15 GMT</pubDate></item><item><title><![CDATA[Reply to stream oder += on Mon, 24 Jun 2013 17:04:04 GMT]]></title><description><![CDATA[<blockquote>
<p>Bist du sicher dass <code>std::string::operator +=</code> ähnliche Komplexitätsgarantien gibt wie <code>std::vector::push_back</code> ?<br />
Ich bin mir nämlich fast sicher dass es nicht so ist.</p>
</blockquote>
<p><a href="http://cppreference.com" rel="nofollow">cppreference.com</a> sagt: constant. Es waere auch grob fahrlaessig, wenn es nicht die gleiche Komplexitaet wie push_back hat.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2333991</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2333991</guid><dc:creator><![CDATA[knivil]]></dc:creator><pubDate>Mon, 24 Jun 2013 17:04:04 GMT</pubDate></item><item><title><![CDATA[Reply to stream oder += on Mon, 24 Jun 2013 17:05:36 GMT]]></title><description><![CDATA[<p>hustbaer schrieb:</p>
<blockquote>
<p>...</p>
</blockquote>
<p>Naja, die Frage war, was ist besser? Auf eine allgemeine Frage kannst auch nur eine allgemeine Antwort geben. Und im Allgemeinen kommst du doch sicher nicht auf die Idee, ostringstream zu verwenden. Intuitiv denkst du an push_back/reserve/+=. Erst wenn du einen ganz speziellen Fall hast, denkst du vielleicht weiter. :p</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2333993</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2333993</guid><dc:creator><![CDATA[out]]></dc:creator><pubDate>Mon, 24 Jun 2013 17:05:36 GMT</pubDate></item><item><title><![CDATA[Reply to stream oder += on Mon, 24 Jun 2013 17:21:11 GMT]]></title><description><![CDATA[<p>knivil schrieb:</p>
<blockquote>
<blockquote>
<p>Bist du sicher dass <code>std::string::operator +=</code> ähnliche Komplexitätsgarantien gibt wie <code>std::vector::push_back</code> ?<br />
Ich bin mir nämlich fast sicher dass es nicht so ist.</p>
</blockquote>
<p><a href="http://cppreference.com" rel="nofollow">cppreference.com</a> sagt: constant. Es waere auch grob fahrlaessig, wenn es nicht die gleiche Komplexitaet wie push_back hat.</p>
</blockquote>
<p>Der Standard sagt aber tatsächlich nichts darüber.</p>
<p>(Das ändert natürlich nichts daran, dass die zweite Variante trotzdem weit besser ist, außer in ganz speziellen Spezialfällen, die hustbaer konstruieren könnte)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2334001</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2334001</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Mon, 24 Jun 2013 17:21:11 GMT</pubDate></item><item><title><![CDATA[Reply to stream oder += on Mon, 24 Jun 2013 17:26:12 GMT]]></title><description><![CDATA[<p>out schrieb:</p>
<blockquote>
<p>hustbaer schrieb:</p>
<blockquote>
<p>...</p>
</blockquote>
<p>Naja, die Frage war, was ist besser? Auf eine allgemeine Frage kannst auch nur eine allgemeine Antwort geben. Und im Allgemeinen kommst du doch sicher nicht auf die Idee, ostringstream zu verwenden. Intuitiv denkst du an push_back/reserve/+=. Erst wenn du einen ganz speziellen Fall hast, denkst du vielleicht weiter. :p</p>
</blockquote>
<p>Intuitiv übersetze ich den Begriff <code>StringBuilder</code> in Gedanken in C++ als <code>std::vector&lt;char&gt;</code> .</p>
<p>Natürlich darf es auch gerne mal <code>std::string</code> sein, aber nur wenn ich sicher bin dass es OK ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2334005</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2334005</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Mon, 24 Jun 2013 17:26:12 GMT</pubDate></item><item><title><![CDATA[Reply to stream oder += on Mon, 24 Jun 2013 17:35:47 GMT]]></title><description><![CDATA[<p>knivil schrieb:</p>
<blockquote>
<blockquote>
<p>Bist du sicher dass <code>std::string::operator +=</code> ähnliche Komplexitätsgarantien gibt wie <code>std::vector::push_back</code> ?<br />
Ich bin mir nämlich fast sicher dass es nicht so ist.</p>
</blockquote>
<p><a href="http://cppreference.com" rel="nofollow">cppreference.com</a> sagt: constant. Es waere auch grob fahrlaessig, wenn es nicht die gleiche Komplexitaet wie push_back hat.</p>
</blockquote>
<p>Also ich würde weder das eine noch das andere als grob fahrlaessig bezeichnen.<br />
Ich kenne einige Entwickler die es ziemlich schlimm finden würden wenn <code>std::string</code> Speicherplatz verschwendet. Man denke da auch an kleine schwachbrüstige Systeme wie sie im embedded Bereich zu finden sind.</p>
<p>Klar, wenn man will dass <code>size() == capacity()</code> könnte man als Programmierer natürlich &quot;deutlich daraufhinweisen&quot;, indem man den String nochmal kopiert nachdem er das letzte mal verändert wurde.<br />
Also quasi</p>
<pre><code class="language-cpp">std::string(str).swap(str);
</code></pre>
<p>oder so.</p>
<p>Finde ich aber umständlich, bzw. wird wohl kaum ein Programm machen.</p>
<p>OK, ein denkbarer Mittelweg wäre vielleicht den String nicht immer um 30~100% wachsen zu lassen, sondern um vielleicht 5~10%. Speicherplatzverschwendung bleibt es natürlich trotzdem, aber halt nicht mehr ganz so krass.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2334010</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2334010</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Mon, 24 Jun 2013 17:35:47 GMT</pubDate></item><item><title><![CDATA[Reply to stream oder += on Mon, 24 Jun 2013 17:39:45 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/19375">@SeppJ</a><br />
Also vorausgesetzt <code>std::string</code> hat die &quot;push_back&quot; Optimierung nicht... dann ist der &quot;Sonderfall&quot; ja wohl ganz einfach: häng 1 Mio. Wörter zusammen.</p>
<p>Ob und wieviel <code>std::ostringstream</code> da besser abschneidet weiss ich aber ehrlich gesagt auch nicht. Nur würde ich es mir da eher erwarten dass die Klasse auf &quot;String-Builder&quot; optimiert ist als bei <code>std::string</code> . Weil's halt der klassische Anwendungsfall für nen <code>std::ostringstream</code> ist.</p>
<p>Meine Wahl wäre da wie gesagt (siehe vor-voriger Beitrag) eher <code>std::vector&lt;char&gt;</code> .</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2334012</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2334012</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Mon, 24 Jun 2013 17:39:45 GMT</pubDate></item><item><title><![CDATA[Reply to stream oder += on Mon, 24 Jun 2013 17:47:40 GMT]]></title><description><![CDATA[<p>hustbaer schrieb:</p>
<blockquote>
<p>Meine Wahl wäre da wie gesagt (siehe vor-voriger Beitrag) eher <code>std::vector&lt;char&gt;</code> .</p>
</blockquote>
<p><code>std::deque&lt;char&gt;</code> wäre auch noch ein Versuch wert.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2334017</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2334017</guid><dc:creator><![CDATA[wählerstimme]]></dc:creator><pubDate>Mon, 24 Jun 2013 17:47:40 GMT</pubDate></item><item><title><![CDATA[Reply to stream oder += on Mon, 24 Jun 2013 17:58:41 GMT]]></title><description><![CDATA[<p>hustbaer schrieb:</p>
<blockquote>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/19375">@SeppJ</a><br />
Also vorausgesetzt <code>std::string</code> hat die &quot;push_back&quot; Optimierung nicht... dann ist der &quot;Sonderfall&quot; ja wohl ganz einfach: häng 1 Mio. Wörter zusammen.</p>
</blockquote>
<p>Aber das wichtige Stichwort ist &quot;vorausgesetzt <code>std::string</code> hat die &quot;push_back&quot; Optimierung nicht&quot;. <strong>Das</strong> ist dann nämlich der spezielle Sonderfall.</p>
<p>Bei so allgemeinen Fragestellungen wie hier sollte man wohl auf normale Heimcomputer abzielen. Wie es auf embedded Prozessoren, Superrechnern oder in verteilten Rechenprojekten ist, kann man gerne nebenher erwähnen. Aber nicht den Normalfall zum Sonderfall erklären, besonders wenn der Unterschied so groß ist. Die Lösung zwei wird hier auf dem Heimrechner um Größenordnungen schneller sein. Ohne zu testen schätze ich mal mindestens einen Faktor 100.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2334022</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2334022</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Mon, 24 Jun 2013 17:58:41 GMT</pubDate></item></channel></rss>