<?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[Frage zur Gültigkeit von Iteratoren bei .erase()]]></title><description><![CDATA[<p>Hallo, ich habe eine Multimap, in der ich folgende Aktion durchführe</p>
<pre><code class="language-cpp">std::multimap&lt;std::string, char&gt; container;
//container füllen

std::multimap&lt;std::string, char&gt;::iterator it = container.begin(), et = container.end();
for( ; it != et ; ++it)
{
    if(/*irgend eine bedingung*/)
    {
        container.erase(it);
        et=container.end();
    }
}
</code></pre>
<p>Nach dem erase() Vorgang wird der end-iterator natürlich ungültig, da die containergröße um eins abgenommen hat. erase gibt ja einen iterator zurück, der auf ein Element hinter dem gelöschten zeigt. Ist der alte Iterator dann noch gültig? Wenn ich den neuen Iterator als &quot;it&quot; verwenden würde, würde ja ein Element übersprungen, da &quot;it&quot; ja sofort um eins erhöht wird. Stimmt also der code oben?<br />
Oder ist es üblicher so ein Problem auf folgende Weise zu lösen?</p>
<pre><code class="language-cpp">while(it!=et)
{
    if(/*irgend eine bedingung*/)
    {
        it=container.erase(it);
        et=container.end();
    }
    else
        ++it;
}
</code></pre>
<p>Oder liege ich hier ganz falsch <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=":confused:"
      alt="😕"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/topic/243270/frage-zur-gültigkeit-von-iteratoren-bei-erase</link><generator>RSS for Node</generator><lastBuildDate>Sun, 20 Sep 2026 04:48:31 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/243270.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 15 Jun 2009 00:59:22 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Frage zur Gültigkeit von Iteratoren bei .erase() on Mon, 15 Jun 2009 00:59:22 GMT]]></title><description><![CDATA[<p>Hallo, ich habe eine Multimap, in der ich folgende Aktion durchführe</p>
<pre><code class="language-cpp">std::multimap&lt;std::string, char&gt; container;
//container füllen

std::multimap&lt;std::string, char&gt;::iterator it = container.begin(), et = container.end();
for( ; it != et ; ++it)
{
    if(/*irgend eine bedingung*/)
    {
        container.erase(it);
        et=container.end();
    }
}
</code></pre>
<p>Nach dem erase() Vorgang wird der end-iterator natürlich ungültig, da die containergröße um eins abgenommen hat. erase gibt ja einen iterator zurück, der auf ein Element hinter dem gelöschten zeigt. Ist der alte Iterator dann noch gültig? Wenn ich den neuen Iterator als &quot;it&quot; verwenden würde, würde ja ein Element übersprungen, da &quot;it&quot; ja sofort um eins erhöht wird. Stimmt also der code oben?<br />
Oder ist es üblicher so ein Problem auf folgende Weise zu lösen?</p>
<pre><code class="language-cpp">while(it!=et)
{
    if(/*irgend eine bedingung*/)
    {
        it=container.erase(it);
        et=container.end();
    }
    else
        ++it;
}
</code></pre>
<p>Oder liege ich hier ganz falsch <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=":confused:"
      alt="😕"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1726693</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1726693</guid><dc:creator><![CDATA[Gültigkeit]]></dc:creator><pubDate>Mon, 15 Jun 2009 00:59:22 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zur Gültigkeit von Iteratoren bei .erase() on Mon, 15 Jun 2009 07:28:18 GMT]]></title><description><![CDATA[<p>Gültigkeit schrieb:</p>
<blockquote>
<p>Oder ist es üblicher so ein Problem auf folgende Weise zu lösen?</p>
<pre><code class="language-cpp">while(it!=et)
{
    if(/*irgend eine bedingung*/)
    {
        it=container.erase(it);
        et=container.end();
    }
    else
        ++it;
}
</code></pre>
<p>Oder liege ich hier ganz falsch <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=":confused:"
      alt="😕"
    /></p>
</blockquote>
<p>Nicht ganz, das</p>
<pre><code>et=container.end();
</code></pre>
<p>kannst Du Dir allerdings sparen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1726744</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1726744</guid><dc:creator><![CDATA[jencas]]></dc:creator><pubDate>Mon, 15 Jun 2009 07:28:18 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zur Gültigkeit von Iteratoren bei .erase() on Mon, 15 Jun 2009 13:49:53 GMT]]></title><description><![CDATA[<p>Überprüfe doch einfach bei jedem Schleifendurchlaufe auf</p>
<pre><code class="language-cpp">for( ; it != container.end(); ++it)
</code></pre>
<p>Dann hast du das Problem mit dem ungültig werden von iteratoren nicht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1726995</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1726995</guid><dc:creator><![CDATA[blub* 0]]></dc:creator><pubDate>Mon, 15 Jun 2009 13:49:53 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zur Gültigkeit von Iteratoren bei .erase() on Mon, 15 Jun 2009 14:13:05 GMT]]></title><description><![CDATA[<p>blub² schrieb:</p>
<blockquote>
<p>Überprüfe doch einfach bei jedem Schleifendurchlaufe auf</p>
<pre><code class="language-cpp">for( ; it != container.end(); ++it)
</code></pre>
<p>Dann hast du das Problem mit dem ungültig werden von iteratoren nicht.</p>
</blockquote>
<p>Dann hat er jeden Schleifendruchlauf nen völlig sinnlosen Fkt-Aufruf dabei...<br />
Bei der map sollte das = end() nciht nötig sein, nachdem gelöscht wurde - bei ner liste auch nicht - nur bei nem vector und ner deque wird es nötig - da man den code aber nicht jedes mal ändern möchte, würde ich einfach sagen:<br />
Nimm std::remove_if</p>
<p>bb</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1727011</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1727011</guid><dc:creator><![CDATA[unskilled]]></dc:creator><pubDate>Mon, 15 Jun 2009 14:13:05 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zur Gültigkeit von Iteratoren bei .erase() on Mon, 15 Jun 2009 16:54:28 GMT]]></title><description><![CDATA[<p>unskilled schrieb:</p>
<blockquote>
<p>Bei der map sollte das = end() nciht nötig sein, nachdem gelöscht wurde</p>
</blockquote>
<p>Doch. Binärbäume können sich intern umorganisieren, nachdem ein Objekt gelöscht worden ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1727100</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1727100</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Mon, 15 Jun 2009 16:54:28 GMT</pubDate></item></channel></rss>