<?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[STL: Sinn von Funktionsobjekten und -adaptern?]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich lese mich gerade in die STL ein und verstehe den Sinn von Funktionsobjekten noch nicht so ganz. Zum Beispiel hier:</p>
<pre><code class="language-cpp">template &lt;class T&gt;
class eq : public binary_function&lt;T, T, bool&gt; {
public:
    bool operator() (const T &amp;a, const T&amp; b) const {
        return a == b;
    }
};
</code></pre>
<p>Toll, jetzt habe ich ein Funktionsobjekt, dass <code>a == b</code> zurückgibt. Aber für das ganze brauche ich diese <code>binary_function</code> -Klasse doch nicht.</p>
<p>Das hier erfüllt doch genau den gleichen Zweck:</p>
<pre><code class="language-cpp">template &lt;class T&gt;
bool eq(const T &amp;a, const T &amp;b) {
    return a == b;
}
</code></pre>
<p>Dazu kommt noch, dass ich den Aufruf von <code>eq&lt;int&gt;(10, 20)</code> etwas schöner finde als <code>eq&lt;int&gt;() (10, 20);</code> .</p>
<p>Aber das ganz wird ja noch schlimmer: Diese Arithmetik-, Vergleichs- und Logik-Funktoren scheinen mir gerade mehr als überflüssig.</p>
<p>Anstatt einfach <code>i &lt; 10</code> zu schreiben, lieber <code>less&lt;int&gt;() (i, 10)</code> ? Den einzigen &quot;Vorteil&quot;, den ich hier sehe ist die Typenüberprüfung - wobei das ja auch eher ein Nachteil werden. Wenn ich keine int's mehr vergleichen will, sondern 2 long-Werte habe, muss ich das <code>int</code> im Code ja auch umändern.</p>
<p>Ich verstehe den Sinn einfach nicht, wäre nett, wenn mir das jemand erklären könnte.</p>
<p>Grüße,<br />
Amgon <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/252639/stl-sinn-von-funktionsobjekten-und-adaptern</link><generator>RSS for Node</generator><lastBuildDate>Mon, 14 Sep 2026 09:29:38 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/252639.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 22 Oct 2009 16:51:31 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to STL: Sinn von Funktionsobjekten und -adaptern? on Thu, 22 Oct 2009 16:51:31 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich lese mich gerade in die STL ein und verstehe den Sinn von Funktionsobjekten noch nicht so ganz. Zum Beispiel hier:</p>
<pre><code class="language-cpp">template &lt;class T&gt;
class eq : public binary_function&lt;T, T, bool&gt; {
public:
    bool operator() (const T &amp;a, const T&amp; b) const {
        return a == b;
    }
};
</code></pre>
<p>Toll, jetzt habe ich ein Funktionsobjekt, dass <code>a == b</code> zurückgibt. Aber für das ganze brauche ich diese <code>binary_function</code> -Klasse doch nicht.</p>
<p>Das hier erfüllt doch genau den gleichen Zweck:</p>
<pre><code class="language-cpp">template &lt;class T&gt;
bool eq(const T &amp;a, const T &amp;b) {
    return a == b;
}
</code></pre>
<p>Dazu kommt noch, dass ich den Aufruf von <code>eq&lt;int&gt;(10, 20)</code> etwas schöner finde als <code>eq&lt;int&gt;() (10, 20);</code> .</p>
<p>Aber das ganz wird ja noch schlimmer: Diese Arithmetik-, Vergleichs- und Logik-Funktoren scheinen mir gerade mehr als überflüssig.</p>
<p>Anstatt einfach <code>i &lt; 10</code> zu schreiben, lieber <code>less&lt;int&gt;() (i, 10)</code> ? Den einzigen &quot;Vorteil&quot;, den ich hier sehe ist die Typenüberprüfung - wobei das ja auch eher ein Nachteil werden. Wenn ich keine int's mehr vergleichen will, sondern 2 long-Werte habe, muss ich das <code>int</code> im Code ja auch umändern.</p>
<p>Ich verstehe den Sinn einfach nicht, wäre nett, wenn mir das jemand erklären könnte.</p>
<p>Grüße,<br />
Amgon <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/1796526</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1796526</guid><dc:creator><![CDATA[Amgon]]></dc:creator><pubDate>Thu, 22 Oct 2009 16:51:31 GMT</pubDate></item><item><title><![CDATA[Reply to STL: Sinn von Funktionsobjekten und -adaptern? on Thu, 22 Oct 2009 17:18:21 GMT]]></title><description><![CDATA[<p>Lies dir am besten mal den Wikipedia Artikel zu dem Thema durch:<br />
<a href="http://en.wikipedia.org/wiki/Function_object" rel="nofollow">http://en.wikipedia.org/wiki/Function_object</a><br />
Dieser dürfte schonmal viele Fragen beantworten, wenn noch was unklar ist, frag weiter.</p>
<p>Die ganzen templates für Operatorvergleiche sind natürlich dafür da, dass du nicht für jeden Typen eine eigene Funktion schreiben musst. Und du brauchst Funktionen, denn einen Operator alleine kannst du nicht an eine andere Funktion übergeben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1796550</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1796550</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Thu, 22 Oct 2009 17:18:21 GMT</pubDate></item><item><title><![CDATA[Reply to STL: Sinn von Funktionsobjekten und -adaptern? on Thu, 22 Oct 2009 17:25:55 GMT]]></title><description><![CDATA[<p>Amgon schrieb:</p>
<blockquote>
<p>Das hier erfüllt doch genau den gleichen Zweck:</p>
<pre><code class="language-cpp">template &lt;class T&gt;
bool eq(const T &amp;a, const T &amp;b) {
    return a == b;
}
</code></pre>
</blockquote>
<p>Hier vielleicht schon, aber Funktoren sind viel flexibler und mächtiger als Funktionszeiger. Die Klassentemplates <code>std::unary_function</code> und <code>std::binary_function</code> stellen gleich Typedefs bereit, die zum Beispiel von <code>std::bind1st()</code> verwendet werden. Zudem ist die Chance bei Funktoren grundsätzlich grösser, dass Aufrufe vom Compiler inline gemacht werden können. Funktionszeiger sind in dieser Hinsicht weniger transparent (moderne Compiler sollten Optimierungen bei ihnen trotzdem einigermassen im Griff haben). Ein anderer Vorteil ergibt sich bei Containern wie <code>std::set</code> oder <code>std::map</code> - ein Funktor kann einmal als Templateparameter angegeben werden, bei Funktionszeigern hingegen muss man zuerst den Typ deklarieren und im Konstruktor erst die eigentliche Funktion übergeben.</p>
<p>Ein weiteres Beispiel für die Möglichkeiten, die Funktionsobjekte bieten: Man kann dem Konstruktor Argumente übergeben, welche das Objekt beim eigentlichen Aufruf berücksichtigt - das geht bei Funktionen nicht direkt. So kannst du mit der gleichen Klasse verschiedene Aktionen durchführen. Das folgende Beispiel sollte das Prinzip ungefähr verdeutlichen:</p>
<pre><code class="language-cpp">struct linear_op
{
    linear_op(int factor, int increment)
    : fac(factor)
    , inc(increment)
    {
    }

    void operator() (int&amp; number) const
    {
        number = fac * number + inc;
    }

    int inc;
    int fac;
};

std::vector&lt;int&gt; numbers; // zu füllen
std::for_each(numbers.begin(), numbers.end(), linear_op(3, 2));
std::for_each(numbers.begin(), numbers.end(), linear_op(0, 1));
</code></pre>
<p>Amgon schrieb:</p>
<blockquote>
<p>Dazu kommt noch, dass ich den Aufruf von <code>eq&lt;int&gt;(10, 20)</code> etwas schöner finde als <code>eq&lt;int&gt;() (10, 20);</code> .</p>
</blockquote>
<p>Wann musst du denn ein temporäres Objekt erstellen und dieses im gleichen Ausdruck aufrufen? Aufzurufen brauchst du nichts, wenn du Funktionszeiger/-objekte an die High-Order-STL-Algorithmen übergibst. Die sind für den Aufruf zuständig.</p>
<p>Amgon schrieb:</p>
<blockquote>
<p>Aber das ganz wird ja noch schlimmer: Diese Arithmetik-, Vergleichs- und Logik-Funktoren scheinen mir gerade mehr als überflüssig.</p>
<p>Anstatt einfach <code>i &lt; 10</code> zu schreiben, lieber <code>less&lt;int&gt;() (i, 10)</code> ? Den einzigen &quot;Vorteil&quot;, den ich hier sehe ist die Typenüberprüfung - wobei das ja auch eher ein Nachteil werden. Wenn ich keine int's mehr vergleichen will, sondern 2 long-Werte habe, muss ich das <code>int</code> im Code ja auch umändern.</p>
</blockquote>
<p>Ein <code>std::set&lt;MyClass, std::greater&lt;MyClass&gt; &gt;</code> ist unheimlich praktisch, weil man nur durch das <code>greater</code> angibt, dass Objekte absteigen sortiert werden sollen.</p>
<p>Beispiel für einen arithmetischen Funktionsadapter, der zwei Arrays elementweise multipliziert und das Ergebnis in einem dritten speichert:</p>
<pre><code class="language-cpp">int a[] = {1, 2, 3};
int b[] = {4, 5, 6};
int products[3];
std::transform(a, a+3, b, products, std::multiplies&lt;int&gt;());
</code></pre>
<p>Wie du siehst, können Funktoren einiges vereinfachen. Besonders wenn man sich weiter in Richtung funktionale Programmierung bewegt, hat man ziemlich mächtige Werkzeuge zur Verfügung - mit C++0x erst recht. Ich rate dir, den <a href="http://magazin.c-plusplus.net/artikel/Aufbau%20der%20STL%20-%20Teil%203%3A%20Hilfsklassen%20und%20Erweiterungen" rel="nofollow">Artikel</a> des Magazins zu lesen. Auch Teil 1 und 2 sind sehr empfehlenswert.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1796561</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1796561</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Thu, 22 Oct 2009 17:25:55 GMT</pubDate></item><item><title><![CDATA[Reply to STL: Sinn von Funktionsobjekten und -adaptern? on Thu, 22 Oct 2009 17:32:00 GMT]]></title><description><![CDATA[<p>Achso, diese Funktoren machen also erst später, in Kombination mit anderen STL-Komponenten, sinn? Klingt logisch, dankeschön für die Antworten. <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>Dann lese ich einfach mal weiter.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1796570</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1796570</guid><dc:creator><![CDATA[Amgon]]></dc:creator><pubDate>Thu, 22 Oct 2009 17:32:00 GMT</pubDate></item><item><title><![CDATA[Reply to STL: Sinn von Funktionsobjekten und -adaptern? on Thu, 22 Oct 2009 17:45:30 GMT]]></title><description><![CDATA[<p>Amgon schrieb:</p>
<blockquote>
<p>Achso, diese Funktoren machen also erst später, in Kombination mit anderen STL-Komponenten, sinn?</p>
</blockquote>
<p>Ja, vor allem im Zusammenhang mit den Containern, Iteratoren und Algorithmen (welche grösstenteils auf Containern operieren) zieht man grossen Nutzen aus den STL-Hilfsklassen. Man kann diese Konzepte kombinieren, wie in meinem Beispiel mit <code>std::for_each()</code> und <code>std::vector</code> zu sehen ist.</p>
<p>In den erwähnten Foren-Artikeln findest eine gute Einführung in die STL, betrachte diese als Ergänzung zu deinem Buch. Schau dir unbedingt auch das Nachschlagewerk <a href="http://www.cplusplus.com" rel="nofollow">www.cplusplus.com</a> an, dort ist die STL recht gut dokumentiert. In meinem letzten Post siehst du ausserdem einige Anwendungsbeispiele, die dir einen Eindruck vermitteln können.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1796581</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1796581</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Thu, 22 Oct 2009 17:45:30 GMT</pubDate></item><item><title><![CDATA[Reply to STL: Sinn von Funktionsobjekten und -adaptern? on Thu, 22 Oct 2009 19:00:20 GMT]]></title><description><![CDATA[<p>Und da dein Buch vmtl. &quot;C++ von A bis Z&quot; heißt, solltest du gerade bei diesem Thema ein paar schönere Bücher bevorzugen. <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/1796640</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1796640</guid><dc:creator><![CDATA[Ad aCTa]]></dc:creator><pubDate>Thu, 22 Oct 2009 19:00:20 GMT</pubDate></item><item><title><![CDATA[Reply to STL: Sinn von Funktionsobjekten und -adaptern? on Thu, 22 Oct 2009 19:05:04 GMT]]></title><description><![CDATA[<p>Ad aCTa schrieb:</p>
<blockquote>
<p>Und da dein Buch vmtl. &quot;C++ von A bis Z&quot; heißt, solltest du gerade bei diesem Thema ein paar schönere Bücher bevorzugen. <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>
</blockquote>
<p>Volltreffer, gibts da dran etwas auszusetzen? <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/1796643</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1796643</guid><dc:creator><![CDATA[Amgon]]></dc:creator><pubDate>Thu, 22 Oct 2009 19:05:04 GMT</pubDate></item></channel></rss>