<?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[Immer Funktoren benutzen ?]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich möchte einen Vektor mit Zahlen initialisieren bisher habe ich das so gemacht:</p>
<pre><code class="language-cpp">std::vector&lt;unsigned int&gt;zahlen(10);
for(int i=0;i&lt;zahlen.size();i++)
   zahlen[i] = i;
</code></pre>
<p>Gibt es irgendeinen Grund warum ich mir einen Funktor schreiben sollte und damit den Vektor initialisere so z.B. :</p>
<pre><code class="language-cpp">class count_up
{
public:
	count_up(T start):start_wert(start){};
	void operator()(T &amp;wert)
	{
		wert = start_wert++;
	};
private:
	T start_wert;
};

std::vector&lt;unsigned int&gt;zahlen(10);
std::for_each(zahlen.begin(),zahlen.end(),count_up&lt;unsigned int&gt;(0));
</code></pre>
<p>Wann sollte man Funktoren verwenden? Sollte man für jede kleine Aufgabe einen Funktor verwenden?</p>
<p>mfg<br />
<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/255101/immer-funktoren-benutzen</link><generator>RSS for Node</generator><lastBuildDate>Sat, 12 Sep 2026 05:45:00 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/255101.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 25 Nov 2009 17:31:50 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Immer Funktoren benutzen ? on Wed, 25 Nov 2009 17:31:50 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich möchte einen Vektor mit Zahlen initialisieren bisher habe ich das so gemacht:</p>
<pre><code class="language-cpp">std::vector&lt;unsigned int&gt;zahlen(10);
for(int i=0;i&lt;zahlen.size();i++)
   zahlen[i] = i;
</code></pre>
<p>Gibt es irgendeinen Grund warum ich mir einen Funktor schreiben sollte und damit den Vektor initialisere so z.B. :</p>
<pre><code class="language-cpp">class count_up
{
public:
	count_up(T start):start_wert(start){};
	void operator()(T &amp;wert)
	{
		wert = start_wert++;
	};
private:
	T start_wert;
};

std::vector&lt;unsigned int&gt;zahlen(10);
std::for_each(zahlen.begin(),zahlen.end(),count_up&lt;unsigned int&gt;(0));
</code></pre>
<p>Wann sollte man Funktoren verwenden? Sollte man für jede kleine Aufgabe einen Funktor verwenden?</p>
<p>mfg<br />
<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/1813467</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1813467</guid><dc:creator><![CDATA[McCoolCool]]></dc:creator><pubDate>Wed, 25 Nov 2009 17:31:50 GMT</pubDate></item><item><title><![CDATA[Reply to Immer Funktoren benutzen ? on Wed, 25 Nov 2009 17:38:59 GMT]]></title><description><![CDATA[<p>Was wäre denn bei einem gigantisch großen vector schneller?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1813472</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1813472</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Wed, 25 Nov 2009 17:38:59 GMT</pubDate></item><item><title><![CDATA[Reply to Immer Funktoren benutzen ? on Wed, 25 Nov 2009 17:46:11 GMT]]></title><description><![CDATA[<p>Mit meinem Laienwissen würde ich annehmen das beide Varianten gleich schnell seien müssten.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1813476</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1813476</guid><dc:creator><![CDATA[McCoolCool]]></dc:creator><pubDate>Wed, 25 Nov 2009 17:46:11 GMT</pubDate></item><item><title><![CDATA[Reply to Immer Funktoren benutzen ? on Wed, 25 Nov 2009 18:12:11 GMT]]></title><description><![CDATA[<p>McCoolCool schrieb:</p>
<blockquote>
<p>Wann sollte man Funktoren verwenden? Sollte man für jede kleine Aufgabe einen Funktor verwenden?</p>
</blockquote>
<p>So, wie du fragst, weisst du die Antwort sicher schon selber: Natürlich nicht. <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>Funktoren lohnen sich vor allem, wenn du sie mehrfach anwenden kannst oder du die Füllfunktion von der Initialisierung trennen willst. Für gewisse Operationen sind sie aber notwendig (oder alternativ Funktionszeiger), z.B. als Sortierkriterium. Wenn du dir bei deinem Beispiel unwohl vorkommst und dir nicht die Mühe machen willst, für einen einzigen Fall gleich viel mehr Code zu schreiben, dann lass es. Der Code wird nicht zwingend besser, wenn er mehr auf STL-Style setzt. Da ist auch viel Geschmackssache dabei.</p>
<p>McCoolCool schrieb:</p>
<blockquote>
<p>Mit meinem Laienwissen würde ich annehmen das beide Varianten gleich schnell seien müssten.</p>
</blockquote>
<p>Falls du einen modernen Compiler verwendest, ist das aufgrund der Optimierungen stark anzunehmen. Selbst Funktionszeiger sollten nicht mehr allzu grosse Probleme bereiten, wenn sie Zur Kompilierzeit offen vorliegen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1813487</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1813487</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Wed, 25 Nov 2009 18:12:11 GMT</pubDate></item><item><title><![CDATA[Reply to Immer Funktoren benutzen ? on Wed, 25 Nov 2009 18:33:25 GMT]]></title><description><![CDATA[<p>abgesehen davon wird hier ein stateful functor benutzt, was zu bösen Überraschungen führen kann. Der Standard garantiert nämlich nicht, dass</p>
<ol>
<li>der Functor nicht kopiert wird und</li>
<li>die Reihenfolge bei for_each immer von vorne nach hinten in einem Rutsch durchgeht.<br />
Eine Möglichkeit wäre z.B. dass bei jedem Schleifendurchlauf der Anfangs übergebene Functor kopiert wird und du am Ende mit einem vector voller Nullen dastehst, was ja nicht deine Absicht war.</li>
</ol>
]]></description><link>https://www.c-plusplus.net/forum/post/1813501</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1813501</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Wed, 25 Nov 2009 18:33:25 GMT</pubDate></item><item><title><![CDATA[Reply to Immer Funktoren benutzen ? on Wed, 25 Nov 2009 18:50:36 GMT]]></title><description><![CDATA[<blockquote>
<ol start="2">
<li>die Reihenfolge bei for_each immer von vorne nach hinten in einem Rutsch durchgeht.</li>
</ol>
</blockquote>
<p>Der Standard garantiert, dass die Iteratoren in <code>for_each()</code> von first beginnend bis last - 1 durchgegangen werden. Das ist (soweit ich weiß) der einzige Algorithmus neben <code>copy()</code> , für den diese Garantie gegeben wird. Natürlich löst das das Problem mit der Kopie nicht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1813514</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1813514</guid><dc:creator><![CDATA[Old McDonald]]></dc:creator><pubDate>Wed, 25 Nov 2009 18:50:36 GMT</pubDate></item><item><title><![CDATA[Reply to Immer Funktoren benutzen ? on Wed, 25 Nov 2009 18:58:10 GMT]]></title><description><![CDATA[<p>Jopp, pumuckl - 1. stimmt zawr, aber 2. nicht:</p>
<p>25.1.1 For each schrieb:</p>
<blockquote>
<p>Effects: Applies f to the result of dereferencing every iterator in the range [first, last), starting from first and proceeding to last - 1.</p>
</blockquote>
<p>das mit dem funktor hab ich aber noch nicht gewusst... hab den fehler vrmtl auch schon x-mal gemacht &gt;&lt;</p>
<p>bb</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1813519</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1813519</guid><dc:creator><![CDATA[unskilled]]></dc:creator><pubDate>Wed, 25 Nov 2009 18:58:10 GMT</pubDate></item><item><title><![CDATA[Reply to Immer Funktoren benutzen ? on Wed, 25 Nov 2009 19:49:55 GMT]]></title><description><![CDATA[<p>Interessante Aspekte. Wie würde den ein Nicht-Stateful Funktor aussehen mit dem man 1. verhindern kann?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1813555</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1813555</guid><dc:creator><![CDATA[McCoolCool]]></dc:creator><pubDate>Wed, 25 Nov 2009 19:49:55 GMT</pubDate></item><item><title><![CDATA[Reply to Immer Funktoren benutzen ? on Wed, 25 Nov 2009 19:54:05 GMT]]></title><description><![CDATA[<p>gehen würde es zum bsp. mit bind...<br />
und op() nimmt halt dann nen parameter mehr entgegen...</p>
<p>bb</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1813557</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1813557</guid><dc:creator><![CDATA[unskilled]]></dc:creator><pubDate>Wed, 25 Nov 2009 19:54:05 GMT</pubDate></item><item><title><![CDATA[Reply to Immer Funktoren benutzen ? on Wed, 25 Nov 2009 20:04:47 GMT]]></title><description><![CDATA[<p>Was ist mit <code>std::generate()</code> ? In Verbindung mit <code>std::back_inserter()</code> kann man so auch im STL-Style Zahlen an leere Container anhängen.</p>
<p>Der C++-Standard ist hier nicht 100% genau:</p>
<p>25.2.6 schrieb:</p>
<blockquote>
<pre><code class="language-cpp">template&lt;class ForwardIterator, class Generator&gt;
void generate(ForwardIterator first, ForwardIterator last, Generator gen);

template&lt;class OutputIterator, class Size, class Generator&gt;
void generate_n(OutputIterator first, Size n, Generator gen);
</code></pre>
<p><strong>1 Effects:</strong> Invokes the function object gen and assigns the return value of gen though all the iterators in the range [first, last) or [first, first + n).</p>
</blockquote>
<p>Dass die Iteratoren nicht in der Reihenfolge laufen, bedarf schon fast einer böswilligen Interpretation.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1813561</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1813561</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Wed, 25 Nov 2009 20:04:47 GMT</pubDate></item><item><title><![CDATA[Reply to Immer Funktoren benutzen ? on Wed, 25 Nov 2009 20:23:09 GMT]]></title><description><![CDATA[<p>irgendwie muss ich jetzt an c++ denken</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1813570</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1813570</guid><dc:creator><![CDATA[ysd]]></dc:creator><pubDate>Wed, 25 Nov 2009 20:23:09 GMT</pubDate></item><item><title><![CDATA[Reply to Immer Funktoren benutzen ? on Thu, 26 Nov 2009 08:59:33 GMT]]></title><description><![CDATA[<p>McCoolCool schrieb:</p>
<blockquote>
<p>Gibt es irgendeinen Grund warum ich mir einen Funktor schreiben sollte und damit den Vektor initialisere ...</p>
</blockquote>
<p>zunächst mal keinen (außer s.u.)</p>
<p>Nexus schrieb:</p>
<blockquote>
<p>Da ist auch viel Geschmackssache dabei.</p>
</blockquote>
<p>Das ist wohl in letzter Instanz das ausschlaggebende Kriterium.</p>
<p>volkard schrieb:</p>
<blockquote>
<p>Was wäre denn bei einem gigantisch großen vector schneller?</p>
</blockquote>
<p>Geschwindigkeit ist nicht alles, ein Kriterium 'pro Funktor' ist die schlichte Tatsache, dass man dabei weniger Fehler machen kann - wenn es der Compiler erst mal gefressen hat! Folgendes z.B.:</p>
<pre><code class="language-cpp">for(int i=0;i&lt;=zahlen.size();i++)
   zahlen[i] = i;
</code></pre>
<p>wird zur Laufzeit nicht gleich schiefgehen, sondern vielleicht erst später und beim Kunden - und dann wird's teuer. Beim Einsatz von [begin(),end()) tut man sich schon schwerer, so einen Fehler zu machen.</p>
<p>Aber wenn wir schon bei einem Container mit 10 Elementen über Geschwindigkeit reden, dann ist z.B. diese Lösung mit dem <a href="http://www.boost.org/doc/libs/1_41_0/libs/iterator/doc/counting_iterator.html" rel="nofollow">boost.counting_iterator</a></p>
<pre><code class="language-cpp">#include &lt;boost/iterator/counting_iterator.hpp&gt;
std::vector&lt;unsigned int&gt; zahlen( boost::counting_iterator&lt; unsigned int &gt;(0), boost::counting_iterator&lt; unsigned int &gt;( 10 ) );
</code></pre>
<p>zumindest theoretisch fast um den Faktor 2 schneller, da die Initialisierung von vector&lt;&gt; mit dem Füllen desselben zusammenfällt. Ob sie's dann wirklich ist, hängt wohl im wesentlichen von den Fähigkeiten des verwendeten Compilers ab.<br />
Was oft vergessen wird ist, dass</p>
<pre><code class="language-cpp">std::vector&lt;unsigned int&gt;zahlen(10);
</code></pre>
<p>bereits eine interne Schleife mit vector&lt;&gt;.size() Durchläufen initiiert, um alle Elemente mit 0 zu belegen.</p>
<p>Gruß<br />
Werner</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1813683</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1813683</guid><dc:creator><![CDATA[Werner Salomon]]></dc:creator><pubDate>Thu, 26 Nov 2009 08:59:33 GMT</pubDate></item><item><title><![CDATA[Reply to Immer Funktoren benutzen ? on Thu, 26 Nov 2009 14:05:04 GMT]]></title><description><![CDATA[<p>pumuckl schrieb:</p>
<blockquote>
<p>abgesehen davon wird hier ein stateful functor benutzt, was zu bösen Überraschungen führen kann. Der Standard garantiert nämlich nicht, dass</p>
<ol>
<li>der Functor nicht kopiert wird und</li>
</ol>
</blockquote>
<p>Wieso wäre das denn überhaupt ein Problem?<br />
Ich hab noch mal drüber nachgeguckt und wenn eine Kopie angelegt wird, dann sollte das doch auch keine Probleme machen!?</p>
<p>bb</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1813803</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1813803</guid><dc:creator><![CDATA[unskilled]]></dc:creator><pubDate>Thu, 26 Nov 2009 14:05:04 GMT</pubDate></item><item><title><![CDATA[Reply to Immer Funktoren benutzen ? on Thu, 26 Nov 2009 14:14:39 GMT]]></title><description><![CDATA[<p>unskilled schrieb:</p>
<blockquote>
<p>Ich hab noch mal drüber nachgeguckt und wenn eine Kopie angelegt wird, dann sollte das doch auch keine Probleme machen!?</p>
</blockquote>
<p>Nicht in der heutigen Implementierung der stdlib.<br />
Bei dem Iteratorpaar ist alles übers Kopieren gesagt und das klappt auch.<br />
Bei dem Funktor, der sich wie ein Wert anfühlt, erwarte ich, daß normale Wert-Optimierungen greifen dürfen, wie daß mehrere Threads zum Array-Initialisieren benutzt werden, da macht das Kopieren Ärger.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1813809</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1813809</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Thu, 26 Nov 2009 14:14:39 GMT</pubDate></item><item><title><![CDATA[Reply to Immer Funktoren benutzen ? on Thu, 26 Nov 2009 16:47:13 GMT]]></title><description><![CDATA[<p>EDIT:</p>
<p>wurde schon gesagt, habe nicht genau genug gelesen <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title=":("
      alt="😞"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1813872</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1813872</guid><dc:creator><![CDATA[Shade Of Mine]]></dc:creator><pubDate>Thu, 26 Nov 2009 16:47:13 GMT</pubDate></item><item><title><![CDATA[Reply to Immer Funktoren benutzen ? on Thu, 26 Nov 2009 23:02:45 GMT]]></title><description><![CDATA[<p>Werner Salomon schrieb:</p>
<blockquote>
<p>Geschwindigkeit ist nicht alles, ein Kriterium 'pro Funktor' ist die schlichte Tatsache, dass man dabei weniger Fehler machen kann - wenn es der Compiler erst mal gefressen hat! Folgendes z.B.:</p>
<pre><code class="language-cpp">for(int i=0;i&lt;=zahlen.size();i++)
   zahlen[i] = i;
</code></pre>
<p>wird zur Laufzeit nicht gleich schiefgehen, sondern vielleicht erst später und beim Kunden - und dann wird's teuer. Beim Einsatz von [begin(),end()) tut man sich schon schwerer, so einen Fehler zu machen.</p>
</blockquote>
<p>Was hat das jetzt mit Funktor zu tun? begin(),end() kann man in der Schleife auch ohne Funktor verwenden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1814058</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1814058</guid><dc:creator><![CDATA[???????????]]></dc:creator><pubDate>Thu, 26 Nov 2009 23:02:45 GMT</pubDate></item></channel></rss>