<?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 Algorithmus statt Schleife: Argumente binden, wie?]]></title><description><![CDATA[<p>Servus,</p>
<p>ich stehe am Anfang des Durcharbeitens von &quot;Effective STL&quot;. Bisher habe ich von der STL wenig mehr als die üblichen Container genutzt.</p>
<p>Nun würde ich gerne eine Schleife, die über einen Vector von Werten iteriert, durch einen STL-Operation ersetzen.</p>
<p>Dabei scheitere ich aber am binden der freien Argumente.</p>
<p>Hier der <strong>vorher</strong>-Zustand:</p>
<pre><code class="language-cpp">// macht was mit den einzelnen Werten
double transmogrify(double, double, double);

// schreibe verarbeitete Werte in neuen Vektor:
std::vector&lt;float&gt; modified_values;
modified_values.resize(old_values.size());
for (std::size_t i = 0 ; i &lt; old_values.size() ; i++)
    modified_values[i] = transmogrify(old_values[i], member, anderer_member);
</code></pre>
<p>Der gewünschte <strong>nachher</strong>-Zustand wäre in etwa folgender:</p>
<pre><code class="language-cpp">std::vector&lt;float&gt; modified_values;
modified_values.resize(old_values.size());
std::transform(old_values.begin(), old_values.end(), modified_values.begin(), transmogrify(_1, member, anderer_member) );
</code></pre>
<p>Folgendes habe ich probiert, geht nicht:<br />
-Zweimal std::bind2nd auf transmogrify anwenden, um zuerst aus der triadischen eine dyadische Funktion*) zu machen (den zweiten Parameter von dreien binden), und danach aus der dyadischen eine monadische Funktion (durch binden des noch verbliebenen zweiten (vormals dritten) Parameters).<br />
Fehlermeldung (gcc 4.4):</p>
<pre><code>/usr/include/c++/4.4/backward/binders.h:135: error: ‘double(double, double, double)’ is not a class, struct, or union type
</code></pre>
<p>-Oben gezeigte _1 als Platzhalter von boost::lambda benutzen<br />
Fehlermeldung:</p>
<pre><code>cannot convert ‘const boost::lambda::lambda_functor&lt;boost::lambda::placeholder&lt;1&gt; &gt;’ to ‘double’ for argument ‘1’ to ‘double transmogrify(double, double, double)’
</code></pre>
<p>Ich vermute, ein Problem ist hier die implizite Umwandlung von double in float, die ich in diesem Kontext leider vornehmen muss.</p>
<p>Habe std::for_each bisher immer nur mit monadischen Funktionen genutzt (etwa um Werte auszugeben), vielleicht kann mir armen Unwissenden mal ein Guru der Funktoren erklären, wie man das mit mehr Parametern macht.</p>
<p>Danke!</p>
<p><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="😉"
    /> wie nennt man das im C++-Sprachgebrauch? Trinäre Funktion??? Triadisch/Dyadisch/Monadisch sind die Bezeichnungen, die ich aus &quot;Clean Code&quot; kenne.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/258510/stl-algorithmus-statt-schleife-argumente-binden-wie</link><generator>RSS for Node</generator><lastBuildDate>Wed, 09 Sep 2026 08:29:40 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/258510.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 11 Jan 2010 16:35:46 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to STL Algorithmus statt Schleife: Argumente binden, wie? on Mon, 11 Jan 2010 16:38:27 GMT]]></title><description><![CDATA[<p>Servus,</p>
<p>ich stehe am Anfang des Durcharbeitens von &quot;Effective STL&quot;. Bisher habe ich von der STL wenig mehr als die üblichen Container genutzt.</p>
<p>Nun würde ich gerne eine Schleife, die über einen Vector von Werten iteriert, durch einen STL-Operation ersetzen.</p>
<p>Dabei scheitere ich aber am binden der freien Argumente.</p>
<p>Hier der <strong>vorher</strong>-Zustand:</p>
<pre><code class="language-cpp">// macht was mit den einzelnen Werten
double transmogrify(double, double, double);

// schreibe verarbeitete Werte in neuen Vektor:
std::vector&lt;float&gt; modified_values;
modified_values.resize(old_values.size());
for (std::size_t i = 0 ; i &lt; old_values.size() ; i++)
    modified_values[i] = transmogrify(old_values[i], member, anderer_member);
</code></pre>
<p>Der gewünschte <strong>nachher</strong>-Zustand wäre in etwa folgender:</p>
<pre><code class="language-cpp">std::vector&lt;float&gt; modified_values;
modified_values.resize(old_values.size());
std::transform(old_values.begin(), old_values.end(), modified_values.begin(), transmogrify(_1, member, anderer_member) );
</code></pre>
<p>Folgendes habe ich probiert, geht nicht:<br />
-Zweimal std::bind2nd auf transmogrify anwenden, um zuerst aus der triadischen eine dyadische Funktion*) zu machen (den zweiten Parameter von dreien binden), und danach aus der dyadischen eine monadische Funktion (durch binden des noch verbliebenen zweiten (vormals dritten) Parameters).<br />
Fehlermeldung (gcc 4.4):</p>
<pre><code>/usr/include/c++/4.4/backward/binders.h:135: error: ‘double(double, double, double)’ is not a class, struct, or union type
</code></pre>
<p>-Oben gezeigte _1 als Platzhalter von boost::lambda benutzen<br />
Fehlermeldung:</p>
<pre><code>cannot convert ‘const boost::lambda::lambda_functor&lt;boost::lambda::placeholder&lt;1&gt; &gt;’ to ‘double’ for argument ‘1’ to ‘double transmogrify(double, double, double)’
</code></pre>
<p>Ich vermute, ein Problem ist hier die implizite Umwandlung von double in float, die ich in diesem Kontext leider vornehmen muss.</p>
<p>Habe std::for_each bisher immer nur mit monadischen Funktionen genutzt (etwa um Werte auszugeben), vielleicht kann mir armen Unwissenden mal ein Guru der Funktoren erklären, wie man das mit mehr Parametern macht.</p>
<p>Danke!</p>
<p><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="😉"
    /> wie nennt man das im C++-Sprachgebrauch? Trinäre Funktion??? Triadisch/Dyadisch/Monadisch sind die Bezeichnungen, die ich aus &quot;Clean Code&quot; kenne.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1836916</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1836916</guid><dc:creator><![CDATA[PhilippM]]></dc:creator><pubDate>Mon, 11 Jan 2010 16:38:27 GMT</pubDate></item><item><title><![CDATA[Reply to STL Algorithmus statt Schleife: Argumente binden, wie? on Mon, 11 Jan 2010 16:39:00 GMT]]></title><description><![CDATA[<p>Wenn du sowieso boost benutzt kannst du ja gleich boost::bind benutzen. Das geht dann ziemlich genau so, wie du dir das vorstellst.</p>
<p>Ansonsten kannst du die beiden Parameter einfach in ein struct packen und dann das übergeben, anstatt das mit 3 Parametern machen. Dann kannst du auch ganz einfach bind2nd benutzen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1836920</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1836920</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Mon, 11 Jan 2010 16:39:00 GMT</pubDate></item><item><title><![CDATA[Reply to STL Algorithmus statt Schleife: Argumente binden, wie? on Mon, 11 Jan 2010 16:40:44 GMT]]></title><description><![CDATA[<p>Hmm, das boost::lambda war eher eine Verlegenheitslösung, schöner wäre es natürlich, wenn es ohne boost ginge.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1836925</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1836925</guid><dc:creator><![CDATA[PhilippM]]></dc:creator><pubDate>Mon, 11 Jan 2010 16:40:44 GMT</pubDate></item><item><title><![CDATA[Reply to STL Algorithmus statt Schleife: Argumente binden, wie? on Mon, 11 Jan 2010 16:50:05 GMT]]></title><description><![CDATA[<p>drakon schrieb:</p>
<blockquote>
<p>Wenn du sowieso boost benutzt kannst du ja gleich boost::bind benutzen. Das geht dann ziemlich genau so, wie du dir das vorstellst.</p>
</blockquote>
<p>Oder tr1::bind welcher beim gcc4.4 dabei ist. &lt;tr1/functional&gt;</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1836930</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1836930</guid><dc:creator><![CDATA[brotbernd]]></dc:creator><pubDate>Mon, 11 Jan 2010 16:50:05 GMT</pubDate></item><item><title><![CDATA[Reply to STL Algorithmus statt Schleife: Argumente binden, wie? on Mon, 11 Jan 2010 16:56:01 GMT]]></title><description><![CDATA[<p>drakon schrieb:</p>
<blockquote>
<p>Ansonsten kannst du die beiden Parameter einfach in ein struct packen und dann das übergeben, anstatt das mit 3 Parametern machen. Dann kannst du auch ganz einfach bind2nd benutzen.</p>
</blockquote>
<p>Hmm, also mit einem pair als 2ter Paramater hab ich das gleiche Problem:</p>
<pre><code class="language-cpp">double transmogrify(double, std::pair&lt;double, double&gt;);

std::transform(old_values.begin(), old_values.end(), modified_values.begin(), std::bind2nd(transmogrify, std::make_pair(member, anderer_member)));
</code></pre>
<p>Fehler:</p>
<pre><code>In file included from /usr/include/c++/4.4/bits/stl_function.h:712,
from /usr/include/c++/4.4/functional:50,
from test.cpp:9:
/usr/include/c++/4.4/backward/binders.h: In instantiation of ‘std::binder2nd&lt;double(double, std::pair&lt;double, double&gt;)&gt;’:
test.cpp:34: instantiated from here
/usr/include/c++/4.4/backward/binders.h:135: error: ‘double(double, std::pair&lt;double, double&gt;)’ is not a class, struct, or union type
/usr/include/c++/4.4/backward/binders.h:138: error: ‘double(double, std::pair&lt;double, double&gt;)’ is not a class, struct, or union type
/usr/include/c++/4.4/backward/binders.h:141: error: ‘double(double, std::pair&lt;double, double&gt;)’ is not a class, struct, or union type
/usr/include/c++/4.4/backward/binders.h:146: error: ‘double(double, std::pair&lt;double, double&gt;)’ is not a class, struct, or union type
/usr/include/c++/4.4/backward/binders.h:152: error: ‘double(double, std::pair&lt;double, double&gt;)’ is not a class, struct, or union type
/usr/include/c++/4.4/backward/binders.h:137: error: field ‘std::binder2nd&lt;double(double, std::pair&lt;double, double&gt;)&gt;::op’ invalidly declared function type
/usr/include/c++/4.4/backward/binders.h: In function ‘std::binder2nd&lt;_Operation&gt; std::bind2nd(const _Operation&amp;, const _Tp&amp;) [with _Operation = double(double, std::pair&lt;double, double&gt;), _Tp = std::pair&lt;double, double&gt;]’:
test.cpp:34: instantiated from here
/usr/include/c++/4.4/backward/binders.h:161: error: ‘double(double, std::pair&lt;double, double&gt;)’ is not a class, struct, or union type
In file included from /usr/include/c++/4.4/algorithm:62,
from test.cpp:8:
/usr/include/c++/4.4/bits/stl_algo.h: In function ‘_OIter std::transform(_IIter, _IIter, _OIter, _UnaryOperation) [with _IIter = __gnu_cxx::__normal_iterator&lt;const float*, std::vector&lt;float, std::allocator&lt;float&gt; &gt; &gt;, _OIter = __gnu_cxx::__normal_iterator&lt;float*, std::vector&lt;float, std::allocator&lt;float&gt; &gt; &gt;, _UnaryOperation = std::binder2nd&lt;double(double, std::pair&lt;double, double&gt;)&gt;]’:
test.cpp:34: instantiated from here
/usr/include/c++/4.4/bits/stl_algo.h:4703: error: no match for call to ‘(std::binder2nd&lt;double(double, std::pair&lt;double, double&gt;)&gt;) (const float&amp;)’
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1836934</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1836934</guid><dc:creator><![CDATA[PhilippM]]></dc:creator><pubDate>Mon, 11 Jan 2010 16:56:01 GMT</pubDate></item><item><title><![CDATA[Reply to STL Algorithmus statt Schleife: Argumente binden, wie? on Mon, 11 Jan 2010 16:59:22 GMT]]></title><description><![CDATA[<p>Alternativ kannst du dir einen Funktor basteln, der Parameter als Konstruktor uebernimmt und den Klammeroperator implementiert. Sowas aehnliches habe ich mal bezueglich Sortierung gemacht. Guckst du <a href="http://www.developia.de/developia/viewarticle.php?cid=31792" rel="nofollow">hier</a>. Die letzte im Artikel angesprochene Moeglichkeit laesst sich auch auf std::transform uebertragen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1836937</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1836937</guid><dc:creator><![CDATA[knivil]]></dc:creator><pubDate>Mon, 11 Jan 2010 16:59:22 GMT</pubDate></item><item><title><![CDATA[Reply to STL Algorithmus statt Schleife: Argumente binden, wie? on Mon, 11 Jan 2010 17:20:48 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">#include &lt;algorithm&gt;
#include &lt;vector&gt;
#include &lt;tr1/functional&gt;

// macht was mit den einzelnen Werten
double transmogrify(double, double, double)
{
	return 1.0;
}

int main()
{
	using namespace std;
	using namespace tr1::placeholders;

	double member = 4., anderer_member = 5.6;
	std::vector&lt;double&gt; old_values(10,0);

	std::vector&lt;double&gt; modified_values;
	modified_values.resize(old_values.size());

	std::transform(old_values.begin(), old_values.end(), 
		modified_values.begin(), tr1::bind(transmogrify,_1, member, anderer_member ));

	return 0;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1836954</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1836954</guid><dc:creator><![CDATA[brotbernd]]></dc:creator><pubDate>Mon, 11 Jan 2010 17:20:48 GMT</pubDate></item><item><title><![CDATA[Reply to STL Algorithmus statt Schleife: Argumente binden, wie? on Tue, 12 Jan 2010 09:08:29 GMT]]></title><description><![CDATA[<p>Wobei ich immer eher gegen die Verwendung dieser Funktionen bin, da sie erstens schwerer zu lesen und noch viel viel schlechter zu erweitern sind. Mal eben noch ein paar Debugausgaben da reinschreiben (und nur an der Stelle, also nicht in der aufgerufenen Funktion) geht nicht, ohne das ganze wieder aufzudröseln.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1837341</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1837341</guid><dc:creator><![CDATA[Fellhuhn]]></dc:creator><pubDate>Tue, 12 Jan 2010 09:08:29 GMT</pubDate></item><item><title><![CDATA[Reply to STL Algorithmus statt Schleife: Argumente binden, wie? on Tue, 12 Jan 2010 10:40:58 GMT]]></title><description><![CDATA[<p>knivil schrieb:</p>
<blockquote>
<p>Alternativ kannst du dir einen Funktor basteln, der Parameter als Konstruktor uebernimmt und den Klammeroperator implementiert.</p>
</blockquote>
<p>Super Idee, Danke! Funktioniert. Warum hab ich da nicht gleich dran gedacht?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1837404</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1837404</guid><dc:creator><![CDATA[PhilippM]]></dc:creator><pubDate>Tue, 12 Jan 2010 10:40:58 GMT</pubDate></item></channel></rss>