<?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::map und remove_if() geht das?]]></title><description><![CDATA[<p>Servus,</p>
<p>ich möchte selektiv Einträge aus einer map löschen. Bisher mache ich das so:</p>
<pre><code class="language-cpp">for (std::map&lt;int, std::string&gt;::iterator i = m_map.begin(), e = m_map.end(); i != e; )
{
    if (condition)
        m_map.erase(i++);
    else
        ++i;
}
</code></pre>
<p>Weil ich gelesen habe, remove_if() würde bei maps nicht gehen, da maps die Reihenfolge verändern.<br />
Stimmt das?</p>
<p>Ist obiger Weg sicher(er)?</p>
<p>Gruß,<br />
Phil</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/243529/std-map-und-remove_if-geht-das</link><generator>RSS for Node</generator><lastBuildDate>Tue, 08 Sep 2026 12:04:40 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/243529.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 17 Jun 2009 20:58:45 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to std::map und remove_if() geht das? on Wed, 17 Jun 2009 20:58:45 GMT]]></title><description><![CDATA[<p>Servus,</p>
<p>ich möchte selektiv Einträge aus einer map löschen. Bisher mache ich das so:</p>
<pre><code class="language-cpp">for (std::map&lt;int, std::string&gt;::iterator i = m_map.begin(), e = m_map.end(); i != e; )
{
    if (condition)
        m_map.erase(i++);
    else
        ++i;
}
</code></pre>
<p>Weil ich gelesen habe, remove_if() würde bei maps nicht gehen, da maps die Reihenfolge verändern.<br />
Stimmt das?</p>
<p>Ist obiger Weg sicher(er)?</p>
<p>Gruß,<br />
Phil</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1728483</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1728483</guid><dc:creator><![CDATA[PhilippM]]></dc:creator><pubDate>Wed, 17 Jun 2009 20:58:45 GMT</pubDate></item><item><title><![CDATA[Reply to std::map und remove_if() geht das? on Wed, 17 Jun 2009 21:08:23 GMT]]></title><description><![CDATA[<p>remove_if() dürfte bei <code>std::map&lt;&gt;</code> gar nicht erst compilieren, da für <code>std::map&lt;Key, Val&gt;</code> der <code>value_type</code> des Iterators <code>std::pair &lt;const Key, Val&gt;</code> ist - demnach kann der Key eines Elements nicht verändert werden. Das ist auch gut so - sonst würdest du das Gleichgewicht der Baumstruktur, über die std::map&lt;&gt; implementiert ist, durcheinanderbringen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1728485</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1728485</guid><dc:creator><![CDATA[audacia]]></dc:creator><pubDate>Wed, 17 Jun 2009 21:08:23 GMT</pubDate></item><item><title><![CDATA[Reply to std::map und remove_if() geht das? on Wed, 17 Jun 2009 21:11:32 GMT]]></title><description><![CDATA[<p>So in etwa hatte ich das auch Erinnerung.</p>
<p>Also ist obiger weg der richtige? Irgendwie hab ich beim iterator-rumschieben Bauchschmerzen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1728487</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1728487</guid><dc:creator><![CDATA[PhilippM]]></dc:creator><pubDate>Wed, 17 Jun 2009 21:11:32 GMT</pubDate></item><item><title><![CDATA[Reply to std::map und remove_if() geht das? on Wed, 17 Jun 2009 21:17:54 GMT]]></title><description><![CDATA[<p>Das ist nicht gut, da der Iterator nach dieser Operation ungültig sein kann.</p>
<pre><code class="language-cpp">m_map.erase(i++);
</code></pre>
<p>Mach stattdessen</p>
<pre><code class="language-cpp">i = m_map.erase(i);
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1728491</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1728491</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Wed, 17 Jun 2009 21:17:54 GMT</pubDate></item><item><title><![CDATA[Reply to std::map und remove_if() geht das? on Wed, 17 Jun 2009 21:20:14 GMT]]></title><description><![CDATA[<p>Nexus schrieb:</p>
<blockquote>
<p>Das ist nicht gut, da der Iterator nach dieser Operation ungültig sein kann.</p>
<pre><code class="language-cpp">m_map.erase(i++);
</code></pre>
<p>Mach stattdessen</p>
<pre><code class="language-cpp">i = m_map.erase(i);
</code></pre>
</blockquote>
<p>Und <em>das</em> ist nicht gut, weil map::erase void zurückgibt <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="🙂"
    /> (Ich weiß selbst aber grad auch nicht, warum. Invalidiert &quot;erase&quot; die Iteratoren nicht? <a href="http://cplusplus.com/reference/stl/map/erase/" rel="nofollow">Hier</a> steht leider auch nix dazu)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1728493</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1728493</guid><dc:creator><![CDATA[Badestrand]]></dc:creator><pubDate>Wed, 17 Jun 2009 21:20:14 GMT</pubDate></item><item><title><![CDATA[Reply to std::map und remove_if() geht das? on Wed, 17 Jun 2009 21:34:39 GMT]]></title><description><![CDATA[<p>Oh, stimmt, ich hatte das aus sequentiellen Containern noch so in Erinnerung.</p>
<p>Hm. Laut unserem <a href="http://magazin.c-plusplus.net/artikel/Aufbau%20der%20STL%20-%20Teil%201%3A%20Container" rel="nofollow">STL-Artikel</a> (Tabelle unten) werden Iteratoren bei einer <code>std::map</code> nie invalidiert. Ist eigentlich nachvollziehbar, wenn man bedenkt, dass die einzelnen Elemente wie in einer verketteten Liste nur über Zeiger gespeichert sind.</p>
<p>Edit: Das hab ich <a href="http://www.c-plusplus.net/forum/viewtopic-var-t-is-222528.html" rel="nofollow">vor langer Zeit</a> sogar mal gewusst. Ich habe es bei Maps seither kaum noch benötigt... <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>
]]></description><link>https://www.c-plusplus.net/forum/post/1728497</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1728497</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Wed, 17 Jun 2009 21:34:39 GMT</pubDate></item><item><title><![CDATA[Reply to std::map und remove_if() geht das? on Wed, 17 Jun 2009 21:38:35 GMT]]></title><description><![CDATA[<p>Cool, ok! Hab grad getestet, <code>map.erase(x++)</code> scheint ok zu sein, also <code>x</code> danach valide. <code>map.erase(x); ++x;</code> dagegen weniger. Obiger Code müsste dann eigentlich funktionieren.</p>
<p>edit: Btw: Schon merkwürdig, was man manchmal nicht weiß. Gestern hab ich erst erfahren, dass es &quot;auto&quot; auch schon vor C++0x gab (natürlich mit anderer bzw ohne Bedeutung)!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1728498</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1728498</guid><dc:creator><![CDATA[Badestrand]]></dc:creator><pubDate>Wed, 17 Jun 2009 21:38:35 GMT</pubDate></item><item><title><![CDATA[Reply to std::map und remove_if() geht das? on Wed, 17 Jun 2009 21:38:07 GMT]]></title><description><![CDATA[<p>Badestrand schrieb:</p>
<blockquote>
<p><code>map.erase(x); ++x;</code> dagegen weniger.</p>
</blockquote>
<p>Ist auch nicht besonders erstaunlich, dass gelöschte Elemente keinen gültigen Iterator mehr haben. <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/1728500</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1728500</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Wed, 17 Jun 2009 21:38:07 GMT</pubDate></item><item><title><![CDATA[Reply to std::map und remove_if() geht das? on Wed, 17 Jun 2009 21:40:25 GMT]]></title><description><![CDATA[<p>Nexus schrieb:</p>
<blockquote>
<p>Badestrand schrieb:</p>
<blockquote>
<p><code>map.erase(x); ++x;</code> dagegen weniger.</p>
</blockquote>
<p>Ist auch nicht besonders erstaunlich, dass gelöschte Elemente keinen gültigen Iterator mehr haben. <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>Wollte nur das &quot;nie&quot; beim &quot;werden nie invalid&quot; prüfen <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>
]]></description><link>https://www.c-plusplus.net/forum/post/1728502</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1728502</guid><dc:creator><![CDATA[Badestrand]]></dc:creator><pubDate>Wed, 17 Jun 2009 21:40:25 GMT</pubDate></item><item><title><![CDATA[Reply to std::map und remove_if() geht das? on Wed, 17 Jun 2009 21:43:06 GMT]]></title><description><![CDATA[<p>Badestrand schrieb:</p>
<blockquote>
<p>Cool, ok! Hab grad getestet, <code>map.erase(x++)</code> scheint ok zu sein, also <code>x</code> danach valide. <code>map.erase(x); ++x;</code> dagegen weniger. Obiger Code müsste dann eigentlich funktionieren.</p>
</blockquote>
<p>Alles klar, vielen Dank euch. Wieder ein //!&lt; <a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/20534">@todo</a> Eintrag weniger <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/1728505</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1728505</guid><dc:creator><![CDATA[PhilippM]]></dc:creator><pubDate>Wed, 17 Jun 2009 21:43:06 GMT</pubDate></item><item><title><![CDATA[Reply to std::map und remove_if() geht das? on Wed, 17 Jun 2009 22:22:26 GMT]]></title><description><![CDATA[<p>Badestrand schrieb:</p>
<blockquote>
<p><code>map.erase(x++)</code> scheint ok zu sein,</p>
</blockquote>
<p>Wenn man sich mal den tollen <a href="http://www.c-plusplus.net/forum/viewtopic-var-t-is-232010.html" rel="nofollow">Artikel</a> von pumuckl anschaut wird auch klar warum:</p>
<p>pumuckl schrieb:</p>
<blockquote>
<h2>3.10 operator++, --</h2>
<p><strong>Semantik:</strong> <code>a++</code> : Postinkrement, erhöht den Wert von a um eins und gibt den Wert von a <em>vor</em> der Erhöhung zurück. Im Gegensatz dazu gibt das Präinkrement <code>++a</code> den Wert von a <em>nach</em> der Erhöhung zurück. Analog <code>operator--</code> als Post- bzw. Prädekrement (Erniedrigung).<br />
<strong>Übliche Deklaration:</strong></p>
<pre><code class="language-cpp">X&amp; X::operator++(); //Praeinkrement
const X X::operator++(int); //Postinkrement
</code></pre>
<p>Die Deklaration der Dekrementoperatoren geschieht analog. Die Angabe eines formalen int-Parameters für die Postfix-Operatoren dient lediglich der Unterscheidung, das Argument darf nicht ausgewertet werden. Die Notwendigkeit unterschiedlicher Rückgabetypen als Referenz bzw. eigenes Objekt entstehen aus der Semantik und der entsprechenden Implementierung der Operatoren. Das Postinkrement gibt ein konstantes Objekt zurück, da es unsinnig wäre, das temporäre Rückgabeobjekt zu ändern.<br />
<strong>Übliche Implementierung:</strong><br />
Der Präinkrementoperator wird implementiert, indem die relevanten Attribute entsprechend verändert werden und anschließend eine Referenz auf <code>*this</code> zurückgegeben wird.<br />
Der Postinkrementoperator wird meist mittels des Präinkrements implementiert, seine Semantik macht es im Normalfall nötig dass vor der Erhöhung eine Kopie gemacht wird, die am Ende zurückgegeben wird:</p>
<pre><code class="language-cpp">X X::operator++(int)
{
  X tmp(*this); //Kopier-Konstruktor
  ++(*this); //Inkrement
  return tmp; //alten Wert zurueckgeben
}
</code></pre>
</blockquote>
<p>Der Postinkrement macht in dem Beispiel map.erase( x++ ); also nichts anderes als das was man normalerweise von Hand machen würde:</p>
<pre><code class="language-cpp">std::map&lt;foo,bar&gt;::iterator tmp = x;
map.erase( x );
x = ++tmp;
</code></pre>
<p>Nur viel kürzer und schöner <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>
]]></description><link>https://www.c-plusplus.net/forum/post/1728515</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1728515</guid><dc:creator><![CDATA[rean]]></dc:creator><pubDate>Wed, 17 Jun 2009 22:22:26 GMT</pubDate></item></channel></rss>