<?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[std::for_each auf std::map]]></title><description><![CDATA[<pre><code class="language-cpp">class MyClass
{
    ...
    void bar(int) const;
};

typedef std::map&lt;int, const MyClass*&gt; MyMap;

for(MyMap::const_iterator i = foo.begin(); i != foo.end(); i++)
    i-&gt;second-&gt;bar(1337);
</code></pre>
<p>geht das auch mit std::for_each? vielleicht sogar ohne mindestens viermal so viel code schreiben zu müssen?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/185132/std-for_each-auf-std-map</link><generator>RSS for Node</generator><lastBuildDate>Thu, 24 Sep 2026 01:58:40 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/185132.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 22 Jun 2007 08:28:39 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to std::for_each auf std::map on Fri, 22 Jun 2007 08:28:39 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">class MyClass
{
    ...
    void bar(int) const;
};

typedef std::map&lt;int, const MyClass*&gt; MyMap;

for(MyMap::const_iterator i = foo.begin(); i != foo.end(); i++)
    i-&gt;second-&gt;bar(1337);
</code></pre>
<p>geht das auch mit std::for_each? vielleicht sogar ohne mindestens viermal so viel code schreiben zu müssen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1311225</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1311225</guid><dc:creator><![CDATA[!logged]]></dc:creator><pubDate>Fri, 22 Jun 2007 08:28:39 GMT</pubDate></item><item><title><![CDATA[Reply to std::for_each auf std::map on Fri, 22 Jun 2007 08:57:06 GMT]]></title><description><![CDATA[<p>ne denke nicht, denn eine map ist ja kein datentyp, den man einfach so durchiterieren kann, es sind ja immer zwei zusammengehörende Datentypen. Auch andere forech konstrukte wie BOOST_FOREACH bieten das nicht an, obwohl die bedeutend einfacher zu handhaben sind.</p>
<p><a href="http://www.boost.org/regression-logs/cs-win32_metacomm/doc/html/foreach.html" rel="nofollow">http://www.boost.org/regression-logs/cs-win32_metacomm/doc/html/foreach.html</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1311252</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1311252</guid><dc:creator><![CDATA[Krux]]></dc:creator><pubDate>Fri, 22 Jun 2007 08:57:06 GMT</pubDate></item><item><title><![CDATA[Reply to std::for_each auf std::map on Fri, 22 Jun 2007 09:03:00 GMT]]></title><description><![CDATA[<p>std::for_each funktioniert auf allem was Iteratoren bietet. Und zufällig bieten alle Container der Standardbibliothek Iteratoren. Also: Ja, geht...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1311256</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1311256</guid><dc:creator><![CDATA[LordJaxom]]></dc:creator><pubDate>Fri, 22 Jun 2007 09:03:00 GMT</pubDate></item><item><title><![CDATA[Reply to std::for_each auf std::map on Fri, 22 Jun 2007 09:12:15 GMT]]></title><description><![CDATA[<p>LordJaxom schrieb:</p>
<blockquote>
<p>Also: Ja, geht...</p>
</blockquote>
<p>hättest du ein vielleicht ein minimales beispiel parat, das mit meinem code funktionieren würde?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1311263</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1311263</guid><dc:creator><![CDATA[!logged]]></dc:creator><pubDate>Fri, 22 Jun 2007 09:12:15 GMT</pubDate></item><item><title><![CDATA[Reply to std::for_each auf std::map on Fri, 22 Jun 2007 09:44:44 GMT]]></title><description><![CDATA[<p>Hallo,<br />
also prinzipiell geht das. Allerdings wirst du diese Anforderung:</p>
<blockquote>
<p>vielleicht sogar ohne mindestens viermal so viel code schreiben zu müssen?</p>
</blockquote>
<p>nicht erfüllen können, zumindest, wenn du auf den Einsatz von Bibliotheken wie boost verzichtest.</p>
<p>Hier mal eine Möglichkeit:</p>
<pre><code class="language-cpp">for(MyMap::const_iterator i = foo.begin(); i != foo.end(); i++)
    i-&gt;second-&gt;bar(1337);
</code></pre>
<p>Du willst für jedes Objekt vom Typ MyClass die Memberfunktion bar mit einem festen Argument aufrufen. Dazu brauchen wir std::mem_fun und std::bind2nd:</p>
<pre><code class="language-cpp">bind2nd(mem_fun(&amp;MyClass::bar), 1337)
</code></pre>
<p>Damit kannst du schonmal sowas machen:</p>
<pre><code class="language-cpp">MyClass x;
bind2nd(mem_fun(&amp;MyClass::bar), 1337)(&amp;x); // ergibt x-&gt;bar(1337)
</code></pre>
<p>Jetzt bleibt noch das Problem, dass die Elemente deiner Sequenz nicht vom Typ MyClass* sondern vom Typ MyMap::value_type sind. Du brauchst also noch ein Funktionsobjekt, dass aus einem MyMap::value_type das zweite Element extrahiert und dieses dann an dein bind2nd(mem_fun(&amp;MyClass::bar), 1337)-Gebilde übergibt. Mir fällt dazu nichts aus der Standardlib ein, also selbst schreiben:</p>
<pre><code class="language-cpp">template &lt;class P&gt;
struct Apply2nd {
  Apply2nd(const P&amp; p) : p_(p) {}
  template &lt;class X&gt;
  void operator()(const X&amp; x) const {
    p_(x.second);
  }
  P p_;
};
template &lt;class P&gt;
Apply2nd&lt;P&gt; apply2nd(const P&amp; p) { return Apply2nd&lt;P&gt;(p); }
</code></pre>
<p>Insgesamt:</p>
<pre><code class="language-cpp">std::for_each(foo.begin(), foo.end(), apply2nd(bind2nd(mem_fun(&amp;MyClass::bar), 1337)));
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1311290</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1311290</guid><dc:creator><![CDATA[HumeSikkins]]></dc:creator><pubDate>Fri, 22 Jun 2007 09:44:44 GMT</pubDate></item><item><title><![CDATA[Reply to std::for_each auf std::map on Fri, 22 Jun 2007 10:05:50 GMT]]></title><description><![CDATA[<p>ok, vielen dank dafür. das grundsätzliche vorgehen war mir zumindestens im groben klar, ich hoffte nur es ginge vielleicht doch einfacher bzw. kürzer.</p>
<p>das sieht so nicht besonders intuitiv aus, da bleibe ich bei wohl doch lieber bei der schleife. die versteht man wenigstens auf den ersten blick.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1311315</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1311315</guid><dc:creator><![CDATA[!logged]]></dc:creator><pubDate>Fri, 22 Jun 2007 10:05:50 GMT</pubDate></item><item><title><![CDATA[Reply to std::for_each auf std::map on Fri, 22 Jun 2007 10:16:42 GMT]]></title><description><![CDATA[<p>!logged schrieb:</p>
<blockquote>
<p>...ich hoffte nur es ginge vielleicht doch einfacher bzw. kürzer.....</p>
</blockquote>
<p>Naja, Du hast Dir da ja auch einen besonderen Spezialfall ausgesucht, in der eine Map eigentlich &quot;gegen ihren Sinn&quot; (Random-Zugriff über KeyValue) und dazu noch mit Pointern genutzt wird ... und der deswegen &quot;konventionell&quot; mit schon einem Einzeiler abzuhandeln ist. Viel kürzer als eine Zeile, geht's halt nicht. <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>Aber ich sehe es eigentlich andersherum: Schön, dass die map so einfach auch diese Herangehensweise unterstützt !<br />
Ich wüsste nicht, wie viel Sprechender Code noch werden sollte als:</p>
<pre><code class="language-cpp">for(MyMap::const_iterator i = foo.begin(); i != foo.end(); i++)
    i-&gt;second-&gt;bar(1337);
</code></pre>
<p><img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /></p>
<p>Gruß,</p>
<p>Simon2.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1311322</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1311322</guid><dc:creator><![CDATA[Simon2]]></dc:creator><pubDate>Fri, 22 Jun 2007 10:16:42 GMT</pubDate></item><item><title><![CDATA[Reply to std::for_each auf std::map on Fri, 22 Jun 2007 10:33:12 GMT]]></title><description><![CDATA[<p>Simon2 schrieb:</p>
<blockquote>
<p>!logged schrieb:</p>
<blockquote>
<p>...ich hoffte nur es ginge vielleicht doch einfacher bzw. kürzer.....</p>
</blockquote>
<p>Naja, Du hast Dir da ja auch einen besonderen Spezialfall ausgesucht, in der eine Map eigentlich &quot;gegen ihren Sinn&quot; (Random-Zugriff über KeyValue) und dazu noch mit Pointern genutzt wird ... und der deswegen &quot;konventionell&quot; mit schon einem Einzeiler abzuhandeln ist. Viel kürzer als eine Zeile, geht's halt nicht. <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>
</blockquote>
<p>mein gedanke war, es gibt for_each also benutz es auch. ich wollte es ja nicht kürzer als schleife haben, sondern kürzer als das, was humesikkins da zeigte.</p>
<p>hätte also ruhig etwas mehr code werden dürfen, aber ich finde die schleife im endeffekt doch &quot;schöner&quot; und vor allem verständlicher.</p>
<blockquote>
<p>Aber ich sehe es eigentlich andersherum: Schön, dass die map so einfach auch diese Herangehensweise unterstützt !<br />
Ich wüsste nicht, wie viel Sprechender Code noch werden sollte als:</p>
<pre><code class="language-cpp">for(MyMap::const_iterator i = foo.begin(); i != foo.end(); i++)
    i-&gt;second-&gt;bar(1337);
</code></pre>
</blockquote>
<p>da stimme ich dir zu, aber warum gibt es dann for_each überhaupt? ich finde generell die verbindung iterator+functor in c++ ziemlich umständlich und hässlich. vor allem dass ein funktor nicht lokal in einer funktion definiert werden darf.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1311335</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1311335</guid><dc:creator><![CDATA[!logged]]></dc:creator><pubDate>Fri, 22 Jun 2007 10:33:12 GMT</pubDate></item><item><title><![CDATA[Reply to std::for_each auf std::map on Fri, 22 Jun 2007 10:56:28 GMT]]></title><description><![CDATA[<p>!logged schrieb:</p>
<blockquote>
<p>...warum gibt es dann for_each überhaupt? ...</p>
</blockquote>
<p>1.) eye candy<br />
2.) Erkennungssymbol der Freaks</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="😉"
    /><br />
Na, ich kann mir schon vorstellen, dass es Zusammenhänge gibt, bei denen das kürzer/übersichtlicher ist, als ein entsprechendes for-Konstrukt ... aber ich habe das nur so selten mal benutzt, dass mir keine Antwort einfällt.<br />
Für for_all() hingegen könnte ich mir schon öfter mal einen Einsatz vorstellen....</p>
<p>Gruß,</p>
<p>Simon2.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1311351</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1311351</guid><dc:creator><![CDATA[Simon2]]></dc:creator><pubDate>Fri, 22 Jun 2007 10:56:28 GMT</pubDate></item><item><title><![CDATA[Reply to std::for_each auf std::map on Fri, 22 Jun 2007 11:56:14 GMT]]></title><description><![CDATA[<p>for_each wird es wohl deshalb geben, weil eine eigene for-schleife fehleranfälliger ist. Ruck zuck kannste dir ne Endloschleife oder so bauen, was mit einer for_each weniger der Fall sein wird. Weil for_each schon das inkrementieren und die Ungleichbedingung für dich übernimmt. Klar, ne for-Schleife ist nicht wirklich kompliziert, aber würde es kein for_each geben, hätten sich alle aufgeregt, warum es sowas nicht gibt. Egal wie man es macht... es ist nicht richt. <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>Weiterhin: was ist wirklich an der Geschichte unglücklich? Der ganze Kram wie mem_fun und bind2nd!!! Ich hasse es wie die Pest! Ich muß immer wieder in meinen Büchern nachschlagen, wie man das Zeug verwendet. So selten wie man es benutzt, so schwer ist es in meinen Kopf zu bekommen.</p>
<p>Lösung? Es gibt für C++2009 ein Proposal, welches diesen mem_fun- und bindX-Kram als deprecated klassifiziert! <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=":open_mouth:"
      alt="😮"
    /> Und statt dessen soll in zukunft das neue und einfachere std::tr1::binder den Kram ersetzen! <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="👍"
    /> Wer binder nicht kennt: einfach mal in boost::binder rein schauen. <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/1311402</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1311402</guid><dc:creator><![CDATA[Artchi]]></dc:creator><pubDate>Fri, 22 Jun 2007 11:56:14 GMT</pubDate></item></channel></rss>