<?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::list - element innerhalb eines iterators löschen]]></title><description><![CDATA[<p>Hi,</p>
<p>ich iteriere durch eine std::list und überprüfe dabei die einzelnen Objekte. Als Ergebnis dieser Überprüfung müssen einige Elemente aus der Liste gelöscht werden. wenn ich das allerdings mit remove() noch innerhalb des iterator-for-next-Loops mache, dann fliegt mir das beim nächsten Element um die Ohren.</p>
<p>Also wie kann ich die Elemente dann sauber und innerhalb einer gerade bearbeiteten Liste löschen?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/273986/std-list-element-innerhalb-eines-iterators-löschen</link><generator>RSS for Node</generator><lastBuildDate>Thu, 27 Aug 2026 21:45:02 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/273986.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 16 Sep 2010 19:11:51 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to std::list - element innerhalb eines iterators löschen on Thu, 16 Sep 2010 19:11:51 GMT]]></title><description><![CDATA[<p>Hi,</p>
<p>ich iteriere durch eine std::list und überprüfe dabei die einzelnen Objekte. Als Ergebnis dieser Überprüfung müssen einige Elemente aus der Liste gelöscht werden. wenn ich das allerdings mit remove() noch innerhalb des iterator-for-next-Loops mache, dann fliegt mir das beim nächsten Element um die Ohren.</p>
<p>Also wie kann ich die Elemente dann sauber und innerhalb einer gerade bearbeiteten Liste löschen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1953550</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1953550</guid><dc:creator><![CDATA[Blampf]]></dc:creator><pubDate>Thu, 16 Sep 2010 19:11:51 GMT</pubDate></item><item><title><![CDATA[Reply to std::list - element innerhalb eines iterators löschen on Thu, 16 Sep 2010 19:26:02 GMT]]></title><description><![CDATA[<p><a href="http://www.cplusplus.com/reference/stl/list/erase/" rel="nofollow">http://www.cplusplus.com/reference/stl/list/erase/</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1953554</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1953554</guid><dc:creator><![CDATA[vs]]></dc:creator><pubDate>Thu, 16 Sep 2010 19:26:02 GMT</pubDate></item><item><title><![CDATA[Reply to std::list - element innerhalb eines iterators löschen on Fri, 17 Sep 2010 05:08:58 GMT]]></title><description><![CDATA[<p>Schöne Antwort, passt nur nicht zur gestellten Frage. 6, setzen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1953603</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1953603</guid><dc:creator><![CDATA[Blampf]]></dc:creator><pubDate>Fri, 17 Sep 2010 05:08:58 GMT</pubDate></item><item><title><![CDATA[Reply to std::list - element innerhalb eines iterators löschen on Fri, 17 Sep 2010 05:32:31 GMT]]></title><description><![CDATA[<p>Siehe<br />
<a href="http://www.cplusplus.com/reference/stl/list/erase/" rel="nofollow">http://www.cplusplus.com/reference/stl/list/erase/</a><br />
(achte auf das, was die Funktion zurück gibt!)</p>
<p>Oder nimm gleich:<br />
<a href="http://www.cplusplus.com/reference/stl/list/remove_if/" rel="nofollow">http://www.cplusplus.com/reference/stl/list/remove_if/</a></p>
<p>Wenn Du Code gezeigt hättest, hätte man Dich direkt auf einen Fehler hinweisen können. Denn das Löschen von einigen Listen-Elementen in einer Schleife ist möglich.</p>
<p>Wahrscheinlich sieht Dein Code so aus:</p>
<pre><code class="language-cpp">for (iter_t it = liste.begin(), it!=liste.end(); ++it) {
  if (bedingung) {
    liste.erase(it);
  }
}
</code></pre>
<p>Aber nach dem erase wird natürlich der Iterator ungültig! Deswegen muss man schreiben:</p>
<pre><code class="language-cpp">for (iter_t it = liste.begin(), it!=liste.end();) {
  if (bedingung) {
    it = liste.erase(it);
  } else {
    ++it;
  }
}
</code></pre>
<p>Das ++it habe ich aus derm for(...) rausgenommen.</p>
<p>Und das ist auch in etwa das, was bei std::list::remove_if passiert.</p>
<pre><code class="language-cpp">struct is_odd {
  bool operator()(int i) const {return i%2!=0;}
};

:
:

list&lt;int&gt; iliste = ...
iliste.remove_if(is_odd()); // alle ungeraden Zahlen entfernen
</code></pre>
<p>kk</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1953604</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1953604</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Fri, 17 Sep 2010 05:32:31 GMT</pubDate></item><item><title><![CDATA[Reply to std::list - element innerhalb eines iterators löschen on Fri, 17 Sep 2010 12:34:31 GMT]]></title><description><![CDATA[<p>krümelkacker schrieb:</p>
<blockquote>
<p>...<br />
Aber nach dem erase wird natürlich der Iterator ungültig! Deswegen muss man schreiben:</p>
<pre><code class="language-cpp">for (iter_t it = liste.begin(), it!=liste.end();) {
  if (bedingung) {
    it = liste.erase(it);
  } else {
    ++it;
  }
}
</code></pre>
<p>Das ++it habe ich aus derm for(...) rausgenommen.<br />
...<br />
kk</p>
</blockquote>
<p>damit die iteration trotzdem noch drinne sethet in der for-schleife kannmanauch (wenn man platzgeil ist und so wenig wie zeilen schreiben will) folgendes schreiben:</p>
<pre><code class="language-cpp">for (iter_t it = liste.begin(), it!=liste.end();it++) {
  if (bedingung)
    it = liste.erase(it--);
}
</code></pre>
<p>ich würde es jetzt mal die Tango-Version des elementlöschens nennen (2 Schritte vor 1Schritt zurück .. <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=";D"
      alt="😉"
    /> )</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1953807</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1953807</guid><dc:creator><![CDATA[its_me_mario]]></dc:creator><pubDate>Fri, 17 Sep 2010 12:34:31 GMT</pubDate></item><item><title><![CDATA[Reply to std::list - element innerhalb eines iterators löschen on Fri, 17 Sep 2010 12:47:30 GMT]]></title><description><![CDATA[<p>its_me_mario schrieb:</p>
<blockquote>
<pre><code class="language-cpp">for (iter_t it = liste.begin(), it!=liste.end();it++) {
  if (bedingung)
    it = liste.erase(it--);
}
</code></pre>
<p>ich würde es jetzt mal die Tango-Version des elementlöschens nennen (2 Schritte vor 1 Schritt zurück .. <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=";D"
      alt="😉"
    /> )</p>
</blockquote>
<p>Blöd nur, dass</p>
<ul>
<li><code>it--</code> beim ersten Element der Sequenz nicht erlaubt ist.</li>
<li>in dem Ausdruck, 2mal <code>it</code> verändert wird, ohne dass ein Sequenzpunkt dazwischen ist (--&gt; undefiniertes Verhalten).</li>
</ul>
]]></description><link>https://www.c-plusplus.net/forum/post/1953815</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1953815</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Fri, 17 Sep 2010 12:47:30 GMT</pubDate></item><item><title><![CDATA[Reply to std::list - element innerhalb eines iterators löschen on Fri, 17 Sep 2010 12:46:04 GMT]]></title><description><![CDATA[<p>its_me_mario schrieb:</p>
<blockquote>
<p>damit die iteration trotzdem noch drinne sethet in der for-schleife kannmanauch (wenn man platzgeil ist und so wenig wie zeilen schreiben will) folgendes schreiben:</p>
<pre><code class="language-cpp">for (iter_t it = liste.begin(), it!=liste.end();it++) {
  if (bedingung)
    it = liste.erase(it--);
}
</code></pre>
<p>ich würde es jetzt mal die Tango-Version des elementlöschens nennen (2 Schritte vor 1Schritt zurück .. <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=";D"
      alt="😉"
    /> )</p>
</blockquote>
<p>Was schief geht, wenn zufällig das erste Element gelöscht werden muss.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1953816</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1953816</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Fri, 17 Sep 2010 12:46:04 GMT</pubDate></item><item><title><![CDATA[Reply to std::list - element innerhalb eines iterators löschen on Fri, 17 Sep 2010 12:48:06 GMT]]></title><description><![CDATA[<p>krümelkacker schrieb:</p>
<blockquote>
<p>[*] in dem Ausdruck, 2mal <code>it</code> verändert wird, ohne dass ein Sequenzpunkt dazwischen ist (--&gt; undefiniertes Verhalten).</p>
</blockquote>
<p>Da ist ein Funktionsaufruf dazwischen, folglich auch ein Sequenzpunkt. Zudem sind list-Iteratoren sowieso keine einfachen Pointer, so dass das Dekrementieren zwangsläufig ebenso einen Funktionsaufruf darstellt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1953818</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1953818</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Fri, 17 Sep 2010 12:48:06 GMT</pubDate></item><item><title><![CDATA[Reply to std::list - element innerhalb eines iterators löschen on Fri, 17 Sep 2010 13:00:07 GMT]]></title><description><![CDATA[<p>I stand corrected.</p>
<p>1.9/16</p>
<blockquote>
<p>When calling a function (whether or not the function is inline), there is a sequence point after the evaluation of all<br />
function arguments (if any) which takes place before execution of any expressions or statements in the function body.</p>
<p>There is also a sequence point after the copying of a returned value and before the execution of any expressions outside the function. ...</p>
</blockquote>
]]></description><link>https://www.c-plusplus.net/forum/post/1953819</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1953819</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Fri, 17 Sep 2010 13:00:07 GMT</pubDate></item></channel></rss>