<?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[Artikel: C++ – From goto to std::transform]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>ich habe einen kleinen Artikel geschrieben: <a href="https://github.com/Dobiasd/articles/blob/master/from_goto_to_std-transform.md" rel="nofollow">https://github.com/Dobiasd/articles/blob/master/from_goto_to_std-transform.md</a><br />
Wenn irgendwer Lust hat ihn zu lesen, und Verbesserungsvorschläge oder ähnliches hat, würde ich mich freuen. <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/topic/325039/artikel-c-from-goto-to-std-transform</link><generator>RSS for Node</generator><lastBuildDate>Mon, 13 Jul 2026 05:40:24 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/325039.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 12 Apr 2014 07:51:20 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Artikel: C++ – From goto to std::transform on Sat, 12 Apr 2014 07:51:20 GMT]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>ich habe einen kleinen Artikel geschrieben: <a href="https://github.com/Dobiasd/articles/blob/master/from_goto_to_std-transform.md" rel="nofollow">https://github.com/Dobiasd/articles/blob/master/from_goto_to_std-transform.md</a><br />
Wenn irgendwer Lust hat ihn zu lesen, und Verbesserungsvorschläge oder ähnliches hat, würde ich mich freuen. <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/2394160</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2394160</guid><dc:creator><![CDATA[Dobi]]></dc:creator><pubDate>Sat, 12 Apr 2014 07:51:20 GMT</pubDate></item><item><title><![CDATA[Reply to Artikel: C++ – From goto to std::transform on Sat, 12 Apr 2014 09:37:35 GMT]]></title><description><![CDATA[<p>Ich würde Passagen wie</p>
<blockquote>
<p>I guess nobody in their right mind would do this voluntarily, unless for trolling</p>
</blockquote>
<p>streichen. Der Artikel ist zwar nicht wissenschaftlich, aber man muss das Niveau ja nicht künstlich runter ziehen.<br />
Gibt es einen Grund, wieso transformCond nicht transform heißt? Und fehlen da nicht die Referenzen? (in diesem speziellen Fall nicht, aber im allgemeinen Fall schon)<br />
Ich schreibe Lambdas in eine Zeile, deswegen sieht das ungewohnt für mich aus. Außerdem macht das die Aussage kaputt, dass es mit Lambdas kürzer und einfacher geht.<br />
Bei Performance-vergleichen musst du mindestens den Compiler, die Flags, die Messmethode sowie Rechnerspecs angeben. Die Messmethode hast du als Quelltext angegeben, aber ich bin nicht sofort überzeugt, dass das squareVecNTimes mit dem function-Object nichts verfälscht. Ein Vergleich des erzeugten Assemblercodes wäre bestimmt sinnvoller als eine Zeitmessung.</p>
<p>Ansonsten ist der Artikel ganz nett, wenn auch nicht neu. Ich benutze nie copy_if oder transform sondern immer for-Schleifen. Das sollte ich mir wohl abgewöhnen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2394165</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2394165</guid><dc:creator><![CDATA[nwp3]]></dc:creator><pubDate>Sat, 12 Apr 2014 09:37:35 GMT</pubDate></item><item><title><![CDATA[Reply to Artikel: C++ – From goto to std::transform on Sat, 12 Apr 2014 10:18:57 GMT]]></title><description><![CDATA[<p>Ich werde nach wie vor range-based for Schleifen verwenden, weil sie einfacher zu lesen und deutlich hübscher sind. Du willst mir doch nicht weiß machen, dass ein STL-Algo + Lambda smoother ist als eine Schleife?</p>
<p>Sonst bitte richtige Beispiele.</p>
<blockquote>
<p>Das sollte ich mir wohl abgewöhnen.</p>
</blockquote>
<p>Nein, auf keinen Fall. Nur, wenn tatsächlich <code>transform</code> die Aufgabe genau übernehmen kann, ohne ein vierzeiliges Lambda. Oder wenn das Prädikat/die Funktion schon separat geschrieben ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2394169</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2394169</guid><dc:creator><![CDATA[Columbo]]></dc:creator><pubDate>Sat, 12 Apr 2014 10:18:57 GMT</pubDate></item><item><title><![CDATA[Reply to Artikel: C++ – From goto to std::transform on Sat, 12 Apr 2014 10:59:33 GMT]]></title><description><![CDATA[<p>Ich sehe das ähnlich. Die Argumentation, dass</p>
<pre><code>vector&lt;int&gt; result;
    result.reserve(v.size());
    transform(begin(v), end(v), back_inserter(result), [](int i)
    {
        return i*i;
    });
    return result;
</code></pre>
<p>besser oder sogar lesbarer als</p>
<pre><code>for (int&amp; i : v)
    {
        i = i * i;
    }
    return v;
</code></pre>
<p>ist, weil wir anhand des Namens &quot;transform&quot; die Semantik erkennen, ist nicht überzeugend. Vor allem, da wir erheblich mehr Code haben, und ein Grossteil davon syntaktischer Boilerplate ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2394172</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2394172</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Sat, 12 Apr 2014 10:59:33 GMT</pubDate></item><item><title><![CDATA[Reply to Artikel: C++ – From goto to std::transform on Sat, 12 Apr 2014 11:23:11 GMT]]></title><description><![CDATA[<p>Nexus schrieb:</p>
<blockquote>
<p>Ich sehe das ähnlich. Die Argumentation, dass <em>snip</em> besser oder sogar lesbarer als <em>snip</em> ist, weil wir anhand des Namens &quot;transform&quot; die Semantik erkennen, ist nicht überzeugend. Vor allem, da wir erheblich mehr Code haben, und ein Grossteil davon syntaktischer Boilerplate ist.</p>
</blockquote>
<p>Der <code>for</code> -Code ist besser lesbar, aber er verändert den ursprünglichen <code>vector</code> , während der <code>transform</code> -Code einen neuen erzeugt. Wenn man ihn durch eine <code>push_back</code> -Lösung ersetzt, wird der Zusammenhang zwischen der Reihenvolge von <code>v</code> und <code>result</code> nicht unmittelbar deutlich, während bei <code>transform</code> in der Hinsicht die Semantik klar ist.</p>
<p>Dass der Code trotzdem nicht schön ist, liegt, wie du schon sagtest, an der Syntax, sowohl bezüglich der Iteratoren, als auch bezüglich des Lambdas. Code wie</p>
<pre><code class="language-cpp">result = transform(v, i =&gt; i * i)
</code></pre>
<p>wäre kürzer und lesbarer und die Semantik ist unmittelbar ersichtlich, ich würde ihn deshalb tatsächlich der Schleife vorziehen. Das Problem mit den Iteratoren kann man durch Ranges lösen, bei den Lambdas ist es in der Hinsicht schade, dass für solche Fälle C++ keine übersichtlichere Syntax bietet.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2394175</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2394175</guid><dc:creator><![CDATA[ipsec]]></dc:creator><pubDate>Sat, 12 Apr 2014 11:23:11 GMT</pubDate></item><item><title><![CDATA[Reply to Artikel: C++ – From goto to std::transform on Sat, 12 Apr 2014 12:24:21 GMT]]></title><description><![CDATA[<blockquote>
<p>bei den Lambdas ist es in der Hinsicht schade, dass für solche Fälle C++ keine übersichtlichere Syntax bietet.</p>
</blockquote>
<p>Also <strong>rein theoretisch</strong> ist es möglich, mittels Boost.Proto was zu basteln.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2394183</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2394183</guid><dc:creator><![CDATA[Columbo]]></dc:creator><pubDate>Sat, 12 Apr 2014 12:24:21 GMT</pubDate></item><item><title><![CDATA[Reply to Artikel: C++ – From goto to std::transform on Sat, 12 Apr 2014 13:56:53 GMT]]></title><description><![CDATA[<p>Mit Boost kann man bereits einiges machen.</p>
<pre><code class="language-cpp">#include &lt;boost/lambda/lambda.hpp&gt;
#include &lt;boost/range/algorithm/for_each.hpp&gt;
#include &lt;boost/range/algorithm/copy.hpp&gt;
#include &lt;boost/range/algorithm/transform.hpp&gt;
#include &lt;iostream&gt;

int main()
{
	using boost::lambda::_1;

	std::ostream_iterator&lt;int&gt; out(std::cout, &quot;\n&quot;);

	std::vector&lt;int&gt; result{1, 2, 3, 4};

	boost::for_each(result, _1 *= _1);
	boost::copy(result, out);

	boost::transform(result, out, _1 * _1);
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2394187</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2394187</guid><dc:creator><![CDATA[TyRoXx]]></dc:creator><pubDate>Sat, 12 Apr 2014 13:56:53 GMT</pubDate></item><item><title><![CDATA[Reply to Artikel: C++ – From goto to std::transform on Sat, 12 Apr 2014 14:34:22 GMT]]></title><description><![CDATA[<p>Nexus schrieb:</p>
<blockquote>
<p>Ich sehe das ähnlich. Die Argumentation, dass [...] besser oder sogar lesbarer als [...] ist, weil wir anhand des Namens &quot;transform&quot; die Semantik erkennen, ist nicht überzeugend. Vor allem, da wir erheblich mehr Code haben, und ein Grossteil davon syntaktischer Boilerplate ist.</p>
</blockquote>
<p>Oh, da hatte ich wohl vergessen, die std::transform-Version im Artikel auch auf in-place (schneller wegen loop vectorization) umzustellen.<br />
Jetzt ist es richtig:</p>
<pre><code>vector&lt;int&gt; squareVec5(vector&lt;int&gt; v)
{
    transform(begin(v), end(v), begin(v), [](int i)
    {
        return i*i;
    });
    return v;
}
</code></pre>
<p>Klar ist das immernoch länger als</p>
<pre><code>vector&lt;int&gt; squareVec4(vector&lt;int&gt; v)
{
    for (int&amp; i : v)
    {
        i = i * i;
    }
    return v;
}
</code></pre>
<p>Aber ich finde, dass das bei einem längeren loop-body nicht mehr ins Gewicht fällt. Da freu ich mich dann eher, dass ich dem head direkt ansehe, was los ist.<br />
Ansonsten gibts ja immernoch den transformCont-Wrapper.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2394190</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2394190</guid><dc:creator><![CDATA[Dobi]]></dc:creator><pubDate>Sat, 12 Apr 2014 14:34:22 GMT</pubDate></item><item><title><![CDATA[Reply to Artikel: C++ – From goto to std::transform on Sat, 12 Apr 2014 15:21:17 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>der Text zum 'Range-based for loop'-Abschnitt passt denke ich nicht gut zum Code:</p>
<blockquote>
<p>really know that result is guaranteed to have the same size as v in the end.</p>
</blockquote>
<p>'result' hat einen Rahmen, was wohl sowas wie 'Code-Teil' bedeutet.<br />
'result' gibts aber im Code gar nicht und v hat natürlich immer die size von v.<br />
Mir ist klar was gemeint ist, hat mich aber erstmal verwirrt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2394197</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2394197</guid><dc:creator><![CDATA[Jockelx]]></dc:creator><pubDate>Sat, 12 Apr 2014 15:21:17 GMT</pubDate></item><item><title><![CDATA[Reply to Artikel: C++ – From goto to std::transform on Sat, 12 Apr 2014 15:26:23 GMT]]></title><description><![CDATA[<p>Oh, danke. Das stammte noch aus der Zeit, als ich die Transformation noch nicht in-place gemacht hab. Habs auch direkt korrigiert.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2394198</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2394198</guid><dc:creator><![CDATA[Dobi]]></dc:creator><pubDate>Sat, 12 Apr 2014 15:26:23 GMT</pubDate></item><item><title><![CDATA[Reply to Artikel: C++ – From goto to std::transform on Sat, 12 Apr 2014 17:50:38 GMT]]></title><description><![CDATA[<p>nwp3 schrieb:</p>
<blockquote>
<p>Gibt es einen Grund, wieso transformCond nicht transform heißt?</p>
</blockquote>
<p>Weil transform mit std::transform clashed würde wenn man using namespace std macht.</p>
<p>nwp3 schrieb:</p>
<blockquote>
<p>Und fehlen da nicht die Referenzen? (in diesem speziellen Fall nicht, aber im allgemeinen Fall schon)</p>
</blockquote>
<p>Wo meinst du? Ich lass mir den Container hier für den Fall, dass es ein Vektor ist, extra kopieren.</p>
<p>nwp3 schrieb:</p>
<blockquote>
<p>Bei Performance-vergleichen musst du mindestens den Compiler, die Flags, die Messmethode sowie Rechnerspecs angeben.</p>
</blockquote>
<p>Die Compiler-Flags stehen im source code oben als Kommentar, und was fürn Rechner ich hab, find ich ziemlich egal. Es geht ja nicht darum, wie schnell wie varianten absolut sind, sondern nur im Verhältnis zueinander.</p>
<p>nwp3 schrieb:</p>
<blockquote>
<p>Die Messmethode hast du als Quelltext angegeben, aber ich bin nicht sofort überzeugt, dass das squareVecNTimes mit dem function-Object nichts verfälscht.</p>
</blockquote>
<p>Naja, der vector hat 10000 Elemente. Es wird also 10000 mal so oft ein int quadriert, wie das std::function-Objekt gecallt wird. Da ist der overhead also vollkommen irrelevant.</p>
<p>nwp3 schrieb:</p>
<blockquote>
<p>Ein Vergleich des erzeugten Assemblercodes wäre bestimmt sinnvoller als eine Zeitmessung.</p>
</blockquote>
<p>Ja, das hab ich auch probiert, aber keinen Durchblick bekommen. <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=":/"
      alt="😕"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2394238</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2394238</guid><dc:creator><![CDATA[Dobi]]></dc:creator><pubDate>Sat, 12 Apr 2014 17:50:38 GMT</pubDate></item><item><title><![CDATA[Reply to Artikel: C++ – From goto to std::transform on Sat, 12 Apr 2014 20:32:05 GMT]]></title><description><![CDATA[<p>@Tyrox: Vielen Dank, kannte ich nicht.</p>
<p>Gibt es vielleicht eine Liste mit den geilsten Boost-Funktionen? Boost.Lambda ist ja eine semantische Goldgrube.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2394260</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2394260</guid><dc:creator><![CDATA[Columbo]]></dc:creator><pubDate>Sat, 12 Apr 2014 20:32:05 GMT</pubDate></item><item><title><![CDATA[Reply to Artikel: C++ – From goto to std::transform on Sun, 13 Apr 2014 08:52:04 GMT]]></title><description><![CDATA[<p>Dobi schrieb:</p>
<blockquote>
<p>nwp3 schrieb:</p>
<blockquote>
<p>Und fehlen da nicht die Referenzen? (in diesem speziellen Fall nicht, aber im allgemeinen Fall schon)</p>
</blockquote>
<p>Wo meinst du? Ich lass mir den Container hier für den Fall, dass es ein Vektor ist, extra kopieren.</p>
</blockquote>
<p>Ich denke eher, dass er mit Referenzen die Zitation und Quellen meint.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2394307</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2394307</guid><dc:creator><![CDATA[Skym0sh0]]></dc:creator><pubDate>Sun, 13 Apr 2014 08:52:04 GMT</pubDate></item></channel></rss>