<?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[Lambda auf vector anwenden]]></title><description><![CDATA[<p>Hallo,</p>
<p>in Python kann ich auf einen Vector (hier Liste und mit [] definiert) eine Lambda-Funktion mittels map auf alle Elemente anwenden und erhalten eine neue Liste.</p>
<p>v = [1,2,3,4,5]<br />
lq = map(lambda x: x * x, v)</p>
<p>Wie geht das in C++11 ?<br />
Tue ich mich gerade schwer.</p>
<p>Suchanfragen skalieren wegen der Doppelbedeutung vom map sehr schlecht.</p>
<p>Ob die Elemente im std::vector<a href="std::string" rel="nofollow">std::string</a> &gt; , um was es konkret geht, selbst geändert werden oder ob ich einen neuen Vector erhalte, ist mir schnurz.<br />
Ich möchte mittels eigener Join-Methode Directory-Namen an Filenamen hängen.</p>
<p>Python-Equivalent:</p>
<p>files = os.listdir(&quot;C:\&quot;)<br />
filesWithDir = map(lambda x: os.path.join(dirname, x), files )</p>
<p>Meine C++ Methoden:</p>
<p>ttutil::FileBrowser fb;<br />
std::vector<a href="std::string" rel="nofollow">std::string</a> filenames = fb.filterFiles(&quot;*&quot;);<br />
ttutil::FileBrowser::join(dirname, filename);</p>
<p>Ich suche keine allgemeine Lösung für das Problem. Das bekomme ich schon hin.<br />
Ich möchte wissen, ob das nun in C++11 ebenso kurz zu schreiben geht wie in Python.</p>
<p>Gruß Thomas</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/328684/lambda-auf-vector-anwenden</link><generator>RSS for Node</generator><lastBuildDate>Tue, 07 Jul 2026 07:47:48 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/328684.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 22 Oct 2014 18:20:17 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Lambda auf vector anwenden on Wed, 22 Oct 2014 18:20:17 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>in Python kann ich auf einen Vector (hier Liste und mit [] definiert) eine Lambda-Funktion mittels map auf alle Elemente anwenden und erhalten eine neue Liste.</p>
<p>v = [1,2,3,4,5]<br />
lq = map(lambda x: x * x, v)</p>
<p>Wie geht das in C++11 ?<br />
Tue ich mich gerade schwer.</p>
<p>Suchanfragen skalieren wegen der Doppelbedeutung vom map sehr schlecht.</p>
<p>Ob die Elemente im std::vector<a href="std::string" rel="nofollow">std::string</a> &gt; , um was es konkret geht, selbst geändert werden oder ob ich einen neuen Vector erhalte, ist mir schnurz.<br />
Ich möchte mittels eigener Join-Methode Directory-Namen an Filenamen hängen.</p>
<p>Python-Equivalent:</p>
<p>files = os.listdir(&quot;C:\&quot;)<br />
filesWithDir = map(lambda x: os.path.join(dirname, x), files )</p>
<p>Meine C++ Methoden:</p>
<p>ttutil::FileBrowser fb;<br />
std::vector<a href="std::string" rel="nofollow">std::string</a> filenames = fb.filterFiles(&quot;*&quot;);<br />
ttutil::FileBrowser::join(dirname, filename);</p>
<p>Ich suche keine allgemeine Lösung für das Problem. Das bekomme ich schon hin.<br />
Ich möchte wissen, ob das nun in C++11 ebenso kurz zu schreiben geht wie in Python.</p>
<p>Gruß Thomas</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2423400</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2423400</guid><dc:creator><![CDATA[ThomasT]]></dc:creator><pubDate>Wed, 22 Oct 2014 18:20:17 GMT</pubDate></item><item><title><![CDATA[Reply to Lambda auf vector anwenden on Wed, 22 Oct 2014 18:35:40 GMT]]></title><description><![CDATA[<p>Std::transform oder std::for_each könnten sein, was du suchst.<br />
In C++11 ist es aber immer noch etwas geschwätzig, mit C++14 soll es wohl kürzer werdem.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2423404</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2423404</guid><dc:creator><![CDATA[manni66]]></dc:creator><pubDate>Wed, 22 Oct 2014 18:35:40 GMT</pubDate></item><item><title><![CDATA[Reply to Lambda auf vector anwenden on Wed, 22 Oct 2014 18:36:47 GMT]]></title><description><![CDATA[<p>std::for_each oder std::transform?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2423405</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2423405</guid><dc:creator><![CDATA[Skym0sh0]]></dc:creator><pubDate>Wed, 22 Oct 2014 18:36:47 GMT</pubDate></item><item><title><![CDATA[Reply to Lambda auf vector anwenden on Wed, 22 Oct 2014 18:37:11 GMT]]></title><description><![CDATA[<p>In C++ heißt die Funktion transform.<br />
(An deinem ersten Beispiel orientiert)</p>
<pre><code>ls.reserve(v.size());
std::transform(begin(v), end(v), std::back_inserter(ls), [](auto el) {return map(el);});
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2423406</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2423406</guid><dc:creator><![CDATA[Nathan]]></dc:creator><pubDate>Wed, 22 Oct 2014 18:37:11 GMT</pubDate></item><item><title><![CDATA[Reply to Lambda auf vector anwenden on Wed, 22 Oct 2014 18:39:09 GMT]]></title><description><![CDATA[<p>Wenn du einen neuen vector willst, dann transform oder ähnliches, wenn du das Lambda auf den vorhandenen vector anwenden willst, dann for_each oder ähnliches. Allgemeine Anregung, was es so alles gibt:<br />
<a href="http://en.cppreference.com/w/cpp/algorithm" rel="nofollow">http://en.cppreference.com/w/cpp/algorithm</a><br />
<a href="http://www.cplusplus.com/reference/algorithm/" rel="nofollow">http://www.cplusplus.com/reference/algorithm/</a></p>
<p>Beispiel:</p>
<pre><code>#include &lt;iostream&gt;
#include &lt;algorithm&gt;
#include &lt;vector&gt;
using namespace std;

int main() {
	vector&lt;int&gt; foo = {1,2,3,4,5};
	for_each(foo.begin(), foo.end(), [](int &amp;x){x *= x;});
	for(auto x : foo) cout &lt;&lt; x &lt;&lt; '\n';	
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2423407</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2423407</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Wed, 22 Oct 2014 18:39:09 GMT</pubDate></item><item><title><![CDATA[Reply to Lambda auf vector anwenden on Wed, 22 Oct 2014 20:07:56 GMT]]></title><description><![CDATA[<p>Du könntest dir map recht gemütlich nachbauen:</p>
<pre><code>#include &lt;iterator&gt;
#include &lt;algorithm&gt;

template&lt;typename Functor, typename Container&gt;
Container map(Functor f, Container c) {
    Container result;
	std::transform(std::begin(c), std::end(c), std::inserter(result, std::end(result)), f);
	return result;
}

#include &lt;vector&gt;
#include &lt;iostream&gt;

int main() {
    std::vector&lt;int&gt; normal = { 1, 2, 3, 4, 5 };
	auto doubled = map([](int v) { return v+v; }, normal);
	for(int cur : doubled) {
	    std::cout &lt;&lt; cur &lt;&lt; &quot; &quot;;
	}
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2423422</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2423422</guid><dc:creator><![CDATA[Ethon]]></dc:creator><pubDate>Wed, 22 Oct 2014 20:07:56 GMT</pubDate></item><item><title><![CDATA[Reply to Lambda auf vector anwenden on Thu, 23 Oct 2014 09:31:36 GMT]]></title><description><![CDATA[<p>Ethon schrieb:</p>
<blockquote>
<p>Du könntest dir map recht gemütlich nachbauen:</p>
<p>[code=&quot;cpp&quot;]<br />
template&lt;typename Functor, typename Container&gt;<br />
Container map(Functor f, Container c) {</p>
</blockquote>
<p>Das ist relativ eingeschränkt, weil Du so nur Funktionen zulässt, die ein <code>T</code> auf ein <code>T</code> abbilden. Außerdem kopierst Du unnötig den Quellcontainer.</p>
<p>Eleganter ist es wohl mit so etwas wie die <a href="http://www.boost.org/doc/libs/1_56_0/libs/range/doc/html/range/reference/adaptors/reference/transformed.html" rel="nofollow">Adapter von Boost.Range</a>.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2423507</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2423507</guid><dc:creator><![CDATA[kkaw]]></dc:creator><pubDate>Thu, 23 Oct 2014 09:31:36 GMT</pubDate></item><item><title><![CDATA[Reply to Lambda auf vector anwenden on Thu, 23 Oct 2014 09:59:17 GMT]]></title><description><![CDATA[<p>Kann man natürlich noch mit 500 Zeilen Templatecode weiter verbessern. Reicht aber wohl in den allermeisten Fällen auch so.</p>
<p>Die Kopie war ein Flüchtigkeitsfehler, habe die Referenz vergessen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2423515</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2423515</guid><dc:creator><![CDATA[Ethon]]></dc:creator><pubDate>Thu, 23 Oct 2014 09:59:17 GMT</pubDate></item><item><title><![CDATA[Reply to Lambda auf vector anwenden on Thu, 23 Oct 2014 11:55:35 GMT]]></title><description><![CDATA[<p>Danke euch.</p>
<p>Hab auch meinen Fehler dadurch gefunden.<br />
Ich schrieb</p>
<pre><code>for_each(l.begin(), l.end(), [job](std::string &amp;x){ ttutil::FileBrowser::join(job.InputDirectory, x); });
</code></pre>
<p>statt</p>
<pre><code>for_each(l.begin(), l.end(), [job](std::string &amp;x){ x = ttutil::FileBrowser::join(job.InputDirectory, x); });
</code></pre>
<p>also ohne die Zusweisung. Hab ich übersehen.</p>
<p>Gruß Thomas</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2423556</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2423556</guid><dc:creator><![CDATA[ThomasT]]></dc:creator><pubDate>Thu, 23 Oct 2014 11:55:35 GMT</pubDate></item><item><title><![CDATA[Reply to Lambda auf vector anwenden on Thu, 23 Oct 2014 12:19:13 GMT]]></title><description><![CDATA[<p>Ich habe eben mal ein map implementiert, was dem aus python und perl recht nahe kommt:<br />
<a href="http://ideone.com/CnubMl" rel="nofollow">http://ideone.com/CnubMl</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2423563</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2423563</guid><dc:creator><![CDATA[DrakoXP]]></dc:creator><pubDate>Thu, 23 Oct 2014 12:19:13 GMT</pubDate></item><item><title><![CDATA[Reply to Lambda auf vector anwenden on Thu, 23 Oct 2014 13:42:52 GMT]]></title><description><![CDATA[<p>Cool.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2423590</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2423590</guid><dc:creator><![CDATA[ThomasT]]></dc:creator><pubDate>Thu, 23 Oct 2014 13:42:52 GMT</pubDate></item><item><title><![CDATA[Reply to Lambda auf vector anwenden on Thu, 23 Oct 2014 14:18:06 GMT]]></title><description><![CDATA[<p>DrakoXP schrieb:</p>
<blockquote>
<p>Ich habe eben mal ein map implementiert, was dem aus python und perl recht nahe kommt:<br />
<a href="http://ideone.com/CnubMl" rel="nofollow">http://ideone.com/CnubMl</a></p>
</blockquote>
<p>Upps, das geht ja echt simpler. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f44d.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--thumbs_up"
      title=":+1:"
      alt="👍"
    /></p>
<p>Hier ist imho nun aber das Problem dass auto nicht mehr geht.<br />
Meisten möchte man ja nicht einen vector&lt;float&gt; auf eine list&lt;int&gt; mappen sondern einen vector auf einen vector, ein set auf set etc.</p>
<p>Bei eher komplexeren Typen möchte ich wie bei den Scriptsprachen die einfache Schreibweise haben.</p>
<p>Vlt so?</p>
<pre><code>#include &lt;iterator&gt;
#include &lt;algorithm&gt;
#include &lt;vector&gt;

template&lt;typename T&gt;
struct ContainerRebind;

template&lt;typename T&gt;
struct ContainerRebind&lt;std::vector&lt;T&gt;&gt; {
	template&lt;typename U&gt;
	using Rebind = std::vector&lt;U&gt;;
};

template&lt;typename Functor, typename Container&gt;
auto map(Functor f, Container const&amp; c) -&gt; typename ContainerRebind&lt;Container&gt;::template Rebind&lt;decltype(f(*std::begin(c)))&gt; {
    typename ContainerRebind&lt;Container&gt;::template Rebind&lt;decltype(f(*std::begin(c)))&gt; result;
	std::transform(std::begin(c), std::end(c), std::inserter(result, std::end(result)), f);
	return result;
}

#include &lt;iostream&gt;
#include &lt;cmath&gt;

int main() {
    std::vector&lt;int&gt; normal = { 1, 2, 3, 4, 5 };
	auto sqrts = map([&amp;](int v) { return std::sqrt(v); }, normal);
	for(auto cur : sqrts) {
	    std::cout &lt;&lt; cur &lt;&lt; &quot; &quot;;
	}
}
</code></pre>
<p>Hat den gewaltigen Nachteil dass man für jeden Container einen Rebinder schreiben müsste.</p>
<p>Geht sicher schöner, erleuchtet mich oh Template Gurus. <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/2423595</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2423595</guid><dc:creator><![CDATA[Ethon]]></dc:creator><pubDate>Thu, 23 Oct 2014 14:18:06 GMT</pubDate></item><item><title><![CDATA[Reply to Lambda auf vector anwenden on Thu, 23 Oct 2014 14:33:12 GMT]]></title><description><![CDATA[<p>Ethon schrieb:</p>
<blockquote>
<p>DrakoXP schrieb:</p>
<blockquote>
<p>Ich habe eben mal ein map implementiert, was dem aus python und perl recht nahe kommt:<br />
<a href="http://ideone.com/CnubMl" rel="nofollow">http://ideone.com/CnubMl</a></p>
</blockquote>
<p>Upps, das geht ja echt simpler. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f44d.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--thumbs_up"
      title=":+1:"
      alt="👍"
    /></p>
</blockquote>
<p>Das kommt immer noch darauf an, was man erreichen möchte.</p>
<p>Der Hauptoverhead in meiner Variante ist einfach der Proxy zur Ermittlung des Zielcontainertyps anhand des Rückgabetyps.<br />
Diesen Effekt (Templateparameter anhand des angefragten Rückgabetyps herleiten)<br />
kann man bisher leider nicht anders bewerkstelligen.</p>
<p>Wie du bereits schreibst, erlaubt meine Variante auch mappings zwischen verschiedenen Container-Typen, solange diese foward-iteratoren und back_inserter unterstützen. Auch wenn du mir das vielleicht nicht glaubst, manchmal möchte man das tatsächlich <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="😉"
    /></p>
<p>Ansonsten ist dein Ansatz auch nur bedingt besser lesbar <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f644.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_rolling_eyes"
      title=":rolling_eyes:"
      alt="🙄"
    /></p>
<p>PS: capturest du in deinen Lambdas immer pauschal alles aus dem darüberliegenden Scope, auch wenn es unnötig ist?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2423601</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2423601</guid><dc:creator><![CDATA[DrakoXP]]></dc:creator><pubDate>Thu, 23 Oct 2014 14:33:12 GMT</pubDate></item><item><title><![CDATA[Reply to Lambda auf vector anwenden on Thu, 23 Oct 2014 14:41:34 GMT]]></title><description><![CDATA[<p>DrakoXP schrieb:</p>
<blockquote>
<p>Ethon schrieb:</p>
<blockquote>
<p>DrakoXP schrieb:</p>
<blockquote>
<p>Ich habe eben mal ein map implementiert, was dem aus python und perl recht nahe kommt:<br />
<a href="http://ideone.com/CnubMl" rel="nofollow">http://ideone.com/CnubMl</a></p>
</blockquote>
<p>Upps, das geht ja echt simpler. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f44d.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--thumbs_up"
      title=":+1:"
      alt="👍"
    /></p>
</blockquote>
<p>Das kommt immer noch darauf an, was man erreichen möchte.</p>
<p>Der Hauptoverhead in meiner Variante ist einfach der Proxy zur Ermittlung des Zielcontainertyps anhand des Rückgabetyps.<br />
Diesen Effekt (Templateparameter anhand des angefragten Rückgabetyps herleiten)<br />
kann man bisher leider nicht anders bewerkstelligen.</p>
</blockquote>
<p>Ich war nicht sarkastisch. Hatte nur kompliziertere Ideen. <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="😉"
    /></p>
<p>DrakoXP schrieb:</p>
<blockquote>
<p>Wie du bereits schreibst, erlaubt meine Variante auch mappings zwischen verschiedenen Container-Typen, solange diese foward-iteratoren und back_inserter unterstützen. Auch wenn du mir das vielleicht nicht glaubst, manchmal möchte man das tatsächlich <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="😉"
    /></p>
<p>Ansonsten ist dein Ansatz auch nur bedingt besser lesbar <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f644.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_rolling_eyes"
      title=":rolling_eyes:"
      alt="🙄"
    /></p>
</blockquote>
<p>Geht schon, was man halt will.<br />
Mir geht es primär um die Scriptsprachen-ähnliche Verwendung. Und da finde ich ganz cool es zb in Expressions verwenden zu können.</p>
<p>Klar möchte man manchmal in andere Container umwandeln aber das imho recht selten.</p>
<p>DrakoXP schrieb:</p>
<blockquote>
<p>PS: capturest du in deinen Lambdas immer pauschal alles aus dem darüberliegenden Scope, auch wenn es unnötig ist?</p>
</blockquote>
<p>Ne, habe ich bei Version 1 doch auch nicht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2423604</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2423604</guid><dc:creator><![CDATA[Ethon]]></dc:creator><pubDate>Thu, 23 Oct 2014 14:41:34 GMT</pubDate></item><item><title><![CDATA[Reply to Lambda auf vector anwenden on Thu, 23 Oct 2014 16:50:45 GMT]]></title><description><![CDATA[<p>Ethon schrieb:</p>
<blockquote>
<p>Geht schon, was man halt will.<br />
Mir geht es primär um die Scriptsprachen-ähnliche Verwendung. Und da finde ich ganz cool es zb in Expressions verwenden zu können.</p>
</blockquote>
<p>Das wird auf gar keine Weise zufriedenstellend gehen, weil man in Skriptsprachen ueblicherweise nur einen normalen Containertypen hat, in den groesseren, objektorientierten Sprachen je nach Verwendung aus einer Vielzahl auswaehlt, muss der Typ dazu irgendwie angegeben werden, wenn man nicht zu stark einschraenken will.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2423644</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2423644</guid><dc:creator><![CDATA[Marthog]]></dc:creator><pubDate>Thu, 23 Oct 2014 16:50:45 GMT</pubDate></item><item><title><![CDATA[Reply to Lambda auf vector anwenden on Thu, 23 Oct 2014 20:02:36 GMT]]></title><description><![CDATA[<p>Marthog schrieb:</p>
<blockquote>
<p>Ethon schrieb:</p>
<blockquote>
<p>Geht schon, was man halt will.<br />
Mir geht es primär um die Scriptsprachen-ähnliche Verwendung. Und da finde ich ganz cool es zb in Expressions verwenden zu können.</p>
</blockquote>
<p>Das wird auf gar keine Weise zufriedenstellend gehen, weil man in Skriptsprachen ueblicherweise nur einen normalen Containertypen hat, in den groesseren, objektorientierten Sprachen je nach Verwendung aus einer Vielzahl auswaehlt, muss der Typ dazu irgendwie angegeben werden, wenn man nicht zu stark einschraenken will.</p>
</blockquote>
<p>Ach, ich würde mich mit vector als Sequenztyp schon mal ganz zufrieden geben. Für sets unordered_set, für maps unoredred_maps und für Strings std::string.<br />
Spezialfälle kann man ja speziell behandeln.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2423693</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2423693</guid><dc:creator><![CDATA[Ethon]]></dc:creator><pubDate>Thu, 23 Oct 2014 20:02:36 GMT</pubDate></item><item><title><![CDATA[Reply to Lambda auf vector anwenden on Thu, 23 Oct 2014 21:32:49 GMT]]></title><description><![CDATA[<p>btw. lässt sich für meinen map_proxy auch noch ein templatebasierter Iterator basteln. dann packt man sich noch ein begin() und end() an den Proxy schon geht auch das bewehrte</p>
<pre><code>vector&lt;int&gt; numbers = { 42, 23, 1337 };
for (auto &amp;&amp; p : map([](int number) -&gt; pair&lt;int, bool&gt; { return make_pair(number, !!(number % 2)); }, numbers)
    cout &lt;&lt; p.first &lt;&lt; &quot; is &quot; &lt;&lt; (p.second ? &quot;odd&quot; : &quot;even&quot;) &lt;&lt; &quot;\n&quot;;
</code></pre>
<p>Damit müsste man die Ergebnisse nicht einmal in einen extra Container zwischenspeichern.<br />
Allerdings bin ich gerade zu faul solche Iteratoren zu basteln <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f62e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_open_mouth"
      title=":O"
      alt="😮"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2423713</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2423713</guid><dc:creator><![CDATA[DrakoXP]]></dc:creator><pubDate>Thu, 23 Oct 2014 21:32:49 GMT</pubDate></item><item><title><![CDATA[Reply to Lambda auf vector anwenden on Thu, 23 Oct 2014 21:37:12 GMT]]></title><description><![CDATA[<p>Iteratoren wären vermutlich sowieso eher angesagt. ZB Python gibt bei map ja keine Liste sondern ein map Objekt zurück das lazy mappt.<br />
Schade dass die Stdlib immer mit diesen hässlichen Start-/Enditeratoren und nicht Ranges arbeitet.</p>
<p>Besonders gut gefällt mir aber das Streamkonzept aus Java 8. Damit kann man sich dank der neuen Lambdas sehr gut ausdrücken und anscheinend optimieren die intern auch ganz gut. Wäre interessant das mal für C++ zu implementieren.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2423714</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2423714</guid><dc:creator><![CDATA[Ethon]]></dc:creator><pubDate>Thu, 23 Oct 2014 21:37:12 GMT</pubDate></item><item><title><![CDATA[Reply to Lambda auf vector anwenden on Thu, 23 Oct 2014 22:12:15 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/10459">@DrakoXP</a>: Warum gibst du den Rückgabewert redundanterweise an?</p>
<p>Im Prinzip geht das so:</p>
<pre><code>#include &lt;iostream&gt;
#include &lt;vector&gt;
#include &lt;type_traits&gt;
#include &lt;iterator&gt;

template &lt;typename Func, typename Iterator&gt;
class mapped_range
{
	Func f;
	Iterator first, last;

public:

	mapped_range(Func f, Iterator first, Iterator last) :
		f(f), first(first), last(last) {}

	class iterator :
		std::iterator&lt;std::input_iterator_tag,
	                    typename std::iterator_traits&lt;Iterator&gt;::value_type,
	                    typename std::iterator_traits&lt;Iterator&gt;::difference_type,
	                    typename std::iterator_traits&lt;Iterator&gt;::pointer,
	                    typename std::iterator_traits&lt;Iterator&gt;::reference&gt;
	{
		typename std::remove_reference&lt;Func&gt;::type const* f;
		Iterator i;
		friend class mapped_range;

		iterator(typename std::remove_reference&lt;Func&gt;::type const* f, Iterator i) : f(f), i(i) {}

	public:

		iterator&amp; operator++() {++i; return *this;}
		iterator operator++(int) {auto tmp = *this; ++*this; return tmp;}

		auto operator*() const -&gt; decltype((*f)(*i))
		{return (*f)(*i);}
		auto operator*()       -&gt; decltype((*f)(*i))
		{return (*f)(*i);}

		bool operator==(iterator const&amp; rhs) const
		{
			return i == rhs.i;
		}

		bool operator!=(iterator const&amp; rhs) const
		{
			return !(*this == rhs);
		}
	};

	iterator begin() const {return {&amp;f, first};}
	iterator end () const {return {nullptr, last};}
};

template &lt;typename Func, typename Range&gt;
auto map(Func f, Range&amp;&amp; r) -&gt; mapped_range&lt;Func, decltype(std::begin(r))&gt;
{
	return {f, std::begin(r), std::end(r)};
}
</code></pre>
<p>Wobei, um den <code>operator-&gt;</code> zu implementieren, der Funktionswert zwischengespeichert werden müsste. Ist ja nur eine grobe Skizze.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2423717</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2423717</guid><dc:creator><![CDATA[Columbo]]></dc:creator><pubDate>Thu, 23 Oct 2014 22:12:15 GMT</pubDate></item><item><title><![CDATA[Reply to Lambda auf vector anwenden on Fri, 24 Oct 2014 09:26:10 GMT]]></title><description><![CDATA[<p>Arcoth schrieb:</p>
<blockquote>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/10459">@DrakoXP</a>: Warum gibst du den Rückgabewert redundanterweise an?</p>
</blockquote>
<p>Wo genau?</p>
<p>Btw. gibt deine Variante generell ein mapped_range zurück, was zwar seine Iteratoren hat, aber nicht diese einfache Schreibweise erlaubt:</p>
<pre><code>WhateverContainer&lt;SomeType&gt; foo = map([](...) { /* ... */ }, bar);

// oder sogar
WhateverContainer&lt;SomeType&gt; foo;
foo = map([](...) { /* ... */ }, bar);
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2423773</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2423773</guid><dc:creator><![CDATA[DrakoXP]]></dc:creator><pubDate>Fri, 24 Oct 2014 09:26:10 GMT</pubDate></item><item><title><![CDATA[Reply to Lambda auf vector anwenden on Fri, 24 Oct 2014 09:38:49 GMT]]></title><description><![CDATA[<p>DrakoXP schrieb:</p>
<blockquote>
<p>Wo genau?</p>
</blockquote>
<pre><code>[](int number) -&gt; pair&lt;int, bool&gt; { return make_pair(number, !!(number % 2)); }
</code></pre>
<blockquote>
<p>Btw. gibt deine Variante generell ein mapped_range zurück, was zwar seine Iteratoren hat, aber nicht diese einfache Schreibweise erlaubt:</p>
</blockquote>
<p>Offensichtlich nicht. Ich habe einfach den Iterator-Teil vorgezeigt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2423774</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2423774</guid><dc:creator><![CDATA[Columbo]]></dc:creator><pubDate>Fri, 24 Oct 2014 09:38:49 GMT</pubDate></item><item><title><![CDATA[Reply to Lambda auf vector anwenden on Fri, 24 Oct 2014 11:54:45 GMT]]></title><description><![CDATA[<p>Hier mal ein anderer Vorschlag:</p>
<pre><code>#include &lt;boost/iterator/transform_iterator.hpp&gt;

template &lt;typename Func, typename Iterator&gt;
class mapped_range
{
	Func f;
	Iterator first, last;

	Func getFunctor() {return std::forward&lt;Func&gt;(f);}

public:

	mapped_range(Func f, Iterator const&amp; first, Iterator const&amp; last) :
		f(std::forward&lt;Func&gt;(f)), first(first), last(last) {}

	using iterator = boost::transform_iterator&lt;Func, Iterator&gt;;

	iterator begin() {return {first, getFunctor()};}
	iterator end  () {return {last, getFunctor()};}

	template &lt;typename Container&gt;
	operator Container()
	{
		return {begin(), end()};
	}
};

#include &lt;iterator&gt;
#include &lt;type_traits&gt;

template &lt;typename Func, typename Range&gt;
auto map(Func&amp;&amp; f, Range&amp; r) -&gt; mapped_range&lt;typename std::remove_reference&lt;Func&gt;::type, decltype(std::begin(r))&gt;
{
	return {std::forward&lt;Func&gt;(f), std::begin(r), std::end(r)};
}

template &lt;typename Func, typename Range&gt;
auto map_ref(Func&amp; f, Range&amp; r) -&gt; mapped_range&lt;Func&amp;, decltype(std::begin(r))&gt;
{
	return {f, std::begin(r), std::end(r)};
}

template &lt;typename Func, typename Range&gt;
auto map_funptr(Func* f, Range&amp; r) -&gt; mapped_range&lt;Func*, decltype(std::begin(r))&gt;
{
	return {f, std::begin(r), std::end(r)};
}

#include &lt;cmath&gt;
#include &lt;iostream&gt;
#include &lt;vector&gt;
#include &lt;algorithm&gt;
#include &lt;cstdio&gt;

int main()
{
	std::vector&lt;int&gt; numbers = { 42, 23, 1337 };
	for (p : map([](int number) { return std::make_pair(number, !!(number % 2)); }, numbers))
		std::cout &lt;&lt; p.first &lt;&lt; &quot; is &quot; &lt;&lt; (p.second ? &quot;odd&quot; : &quot;even&quot;) &lt;&lt; &quot;\n&quot;;

	std::vector&lt;float&gt; converted_numbers = map([] (int i) {return std::sin(float(i));}, numbers);
	for (f : converted_numbers)
		std::printf(&quot;%.4f, &quot;, f); // Nathan kriegt Tollwut
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2423802</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2423802</guid><dc:creator><![CDATA[Columbo]]></dc:creator><pubDate>Fri, 24 Oct 2014 11:54:45 GMT</pubDate></item><item><title><![CDATA[Reply to Lambda auf vector anwenden on Fri, 24 Oct 2014 11:52:20 GMT]]></title><description><![CDATA[<p>Sieht schon mal nicht schlecht aus. Was ich persönlich auf jeden Fall wollen würde ist Folgendes:</p>
<pre><code>auto sqrts = map(std::sqrt, unique(filter(isEven, map(toInt, myStringVector))));
</code></pre>
<p>Sollte mit Arcoths Lösung gut möglich sein. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f44d.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--thumbs_up"
      title=":+1:"
      alt="👍"
    /><br />
Vor allem ohne sinnlose Temporaries. Top.</p>
<p>Gerade Lust mich an eine kleine Lib für den Hausgebrauch zu setzen. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f60b.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_savoring_food"
      title=":yum:"
      alt="😋"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2423817</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2423817</guid><dc:creator><![CDATA[Ethon]]></dc:creator><pubDate>Fri, 24 Oct 2014 11:52:20 GMT</pubDate></item><item><title><![CDATA[Reply to Lambda auf vector anwenden on Fri, 24 Oct 2014 14:11:40 GMT]]></title><description><![CDATA[<p>meine finale Version mit map und grep.<br />
<a href="http://ideone.com/V4yixa" rel="nofollow">http://ideone.com/V4yixa</a></p>
<p>Das to&lt;type&gt; ist drin, weilstd::string zu viele nicht-explizite Konstruktoren hat und der Compiler sich da nicht entscheiden kann <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>
<p>Desweiteren kommt das Ganze ohne Boost aus.</p>
<p>Für einfache Funktionszeiger an Stelle von Lambdas könnte man noch etwas einbauen<br />
und ich fürchte, dass generic lambdas aus C++14 hier auch Probleme machen könnten,<br />
aber so funktionieren schonmal einige fancy Sachen <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/2423839</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2423839</guid><dc:creator><![CDATA[DrakoXP]]></dc:creator><pubDate>Fri, 24 Oct 2014 14:11:40 GMT</pubDate></item><item><title><![CDATA[Reply to Lambda auf vector anwenden on Fri, 24 Oct 2014 15:13:22 GMT]]></title><description><![CDATA[<p>DrakoXP schrieb:</p>
<blockquote>
<p>Für einfache Funktionszeiger an Stelle von Lambdas könnte man noch etwas einbauen<br />
und ich fürchte, dass generic lambdas aus C++14 hier auch Probleme machen könnten,<br />
aber so funktionieren schonmal einige fancy Sachen <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>Geht doch bereits mit Funktionszeigern?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2423856</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2423856</guid><dc:creator><![CDATA[Ethon]]></dc:creator><pubDate>Fri, 24 Oct 2014 15:13:22 GMT</pubDate></item></channel></rss>