<?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[Iterieren durch STL-List und dabei löschen]]></title><description><![CDATA[<p>Hallo,</p>
<p>folgendes Programm, welches eine STL-List befuellt, ausgibt, einige Elemente löscht und wieder ausgibt.</p>
<pre><code class="language-cpp">#include &lt;list&gt;
#include &lt;iostream&gt;

using namespace std;

int main()
{
list&lt;int&gt; liste;
liste.push_back(1);
liste.push_back(2);
liste.push_back(0);
liste.push_back(3);
liste.push_back(4);
liste.push_back(5);
liste.push_back(6);
liste.push_back(0);

//Vorher
for(list&lt;int&gt;::iterator i= liste.begin(); i != liste.end(); ++i)
  {
  cout &lt;&lt; (*i) &lt;&lt; endl;
  }
cout &lt;&lt; &quot;-----&quot; &lt;&lt; endl;

//loeschen
for(list&lt;int&gt;::iterator i= liste.begin(); i != liste.end(); ++i)
  {
  cout &lt;&lt; &quot;bearbeite --&gt;&quot; &lt;&lt; (*i) &lt;&lt; &quot;&lt;--&quot; &lt;&lt; endl;
  if ( (*i) == 0 )
        liste.erase(i);
  }

cout &lt;&lt; &quot;------&quot; &lt;&lt; endl;
/Nachher
for(list&lt;int&gt;::iterator i= liste.begin(); i != liste.end(); ++i)
  {
  cout &lt;&lt; (*i) &lt;&lt; endl;
  }

return 0;
}
</code></pre>
<p>Mein Problem ist nun dabei, dass durch das erase() wohl der Iterator ungueltig wird und das Programm stirbt.</p>
<p>Kann man das Problem irgendwie beheben?</p>
<p>Dankeschön</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/122472/iterieren-durch-stl-list-und-dabei-löschen</link><generator>RSS for Node</generator><lastBuildDate>Sun, 23 Aug 2026 05:35:54 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/122472.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 06 Oct 2005 08:51:11 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Iterieren durch STL-List und dabei löschen on Thu, 06 Oct 2005 08:51:41 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>folgendes Programm, welches eine STL-List befuellt, ausgibt, einige Elemente löscht und wieder ausgibt.</p>
<pre><code class="language-cpp">#include &lt;list&gt;
#include &lt;iostream&gt;

using namespace std;

int main()
{
list&lt;int&gt; liste;
liste.push_back(1);
liste.push_back(2);
liste.push_back(0);
liste.push_back(3);
liste.push_back(4);
liste.push_back(5);
liste.push_back(6);
liste.push_back(0);

//Vorher
for(list&lt;int&gt;::iterator i= liste.begin(); i != liste.end(); ++i)
  {
  cout &lt;&lt; (*i) &lt;&lt; endl;
  }
cout &lt;&lt; &quot;-----&quot; &lt;&lt; endl;

//loeschen
for(list&lt;int&gt;::iterator i= liste.begin(); i != liste.end(); ++i)
  {
  cout &lt;&lt; &quot;bearbeite --&gt;&quot; &lt;&lt; (*i) &lt;&lt; &quot;&lt;--&quot; &lt;&lt; endl;
  if ( (*i) == 0 )
        liste.erase(i);
  }

cout &lt;&lt; &quot;------&quot; &lt;&lt; endl;
/Nachher
for(list&lt;int&gt;::iterator i= liste.begin(); i != liste.end(); ++i)
  {
  cout &lt;&lt; (*i) &lt;&lt; endl;
  }

return 0;
}
</code></pre>
<p>Mein Problem ist nun dabei, dass durch das erase() wohl der Iterator ungueltig wird und das Programm stirbt.</p>
<p>Kann man das Problem irgendwie beheben?</p>
<p>Dankeschön</p>
]]></description><link>https://www.c-plusplus.net/forum/post/886213</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/886213</guid><dc:creator><![CDATA[markus.r]]></dc:creator><pubDate>Thu, 06 Oct 2005 08:51:41 GMT</pubDate></item><item><title><![CDATA[Reply to Iterieren durch STL-List und dabei löschen on Thu, 06 Oct 2005 08:53:11 GMT]]></title><description><![CDATA[<p>Hol dir vor dem erase() schon den Iterator auf das nächste Element. <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/886216</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/886216</guid><dc:creator><![CDATA[Redhead]]></dc:creator><pubDate>Thu, 06 Oct 2005 08:53:11 GMT</pubDate></item><item><title><![CDATA[Reply to Iterieren durch STL-List und dabei löschen on Thu, 06 Oct 2005 08:56:56 GMT]]></title><description><![CDATA[<p>war das nicht so, daß man die schon gelesenen löschen darf?</p>
<pre><code class="language-cpp">for(list&lt;int&gt;::iterator i=liste.begin(),next; i != liste.end(); i=next) 
{ 
  next=i;

  cout &lt;&lt; &quot;bearbeite --&gt;&quot; &lt;&lt; (*i) &lt;&lt; &quot;&lt;--&quot; &lt;&lt; endl; 
  if ( (*i) == 0 ) 
        liste.erase(i); 
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/886219</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/886219</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Thu, 06 Oct 2005 08:56:56 GMT</pubDate></item><item><title><![CDATA[Reply to Iterieren durch STL-List und dabei löschen on Thu, 06 Oct 2005 09:01:07 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">//loeschen
for(list&lt;int&gt;::iterator i= liste.begin(); i != liste.end(); ++i)
  {
  cout &lt;&lt; &quot;bearbeite --&gt;&quot; &lt;&lt; (*i) &lt;&lt; &quot;&lt;--&quot; &lt;&lt; endl;
  if ( (*i) == 0 )
        liste.erase(i++); // so
        i = liste.erase(i); // oder so
  }

cout &lt;&lt; &quot;------&quot; &lt;&lt; endl;
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/886223</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/886223</guid><dc:creator><![CDATA[7H3 N4C3R]]></dc:creator><pubDate>Thu, 06 Oct 2005 09:01:07 GMT</pubDate></item><item><title><![CDATA[Reply to Iterieren durch STL-List und dabei löschen on Thu, 06 Oct 2005 09:07:05 GMT]]></title><description><![CDATA[<p>Eher so:</p>
<pre><code class="language-cpp">//loeschen
for(list&lt;int&gt;::iterator i= liste.begin(); i != liste.end(); )
  {
  cout &lt;&lt; &quot;bearbeite --&gt;&quot; &lt;&lt; (*i) &lt;&lt; &quot;&lt;--&quot; &lt;&lt; endl;
  list&lt;int&gt;::iterator kill = i;
  ++i; 
  if ( (*kill) == 0 )
        liste.erase(kill); // so
  }

cout &lt;&lt; &quot;------&quot; &lt;&lt; endl;
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/886229</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/886229</guid><dc:creator><![CDATA[gurru]]></dc:creator><pubDate>Thu, 06 Oct 2005 09:07:05 GMT</pubDate></item><item><title><![CDATA[Reply to Iterieren durch STL-List und dabei löschen on Thu, 06 Oct 2005 09:12:16 GMT]]></title><description><![CDATA[<p>Danke für die vielen und guten Antworten.</p>
<pre><code class="language-cpp">//loeschen
for(list&lt;int&gt;::iterator i= liste.begin(); i != liste.end(); ++i)  //INC
  {
  cout &lt;&lt; &quot;bearbeite --&gt;&quot; &lt;&lt; (*i) &lt;&lt; &quot;&lt;--&quot; &lt;&lt; endl;
  if ( (*i) == 0 )
        i = liste.erase(i); // oder so       //INC
  }

cout &lt;&lt; &quot;------&quot; &lt;&lt; endl;
</code></pre>
<p>Hast diese Loesung nicht den Effekt, dass der Iterator im Fall eines erase() doppelt inkrementiert wird - d.h. einmal im Schleifensteuerkopf (for) und in der Schleife selbst.</p>
<p>Ist das genau so erforderlich oder werden so Elemente übersprungen?<br />
Randelementprobleme?</p>
<p>Ich probiere das gleich mal aus:</p>
<pre><code class="language-cpp">list&lt;int&gt;::iterator i= liste.begin();
while( i != liste.end() )
  {
  if ( (*i) == 0 )
      i= liste.erase(i);
  else
      ++i;
  }
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/886237</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/886237</guid><dc:creator><![CDATA[markus.r]]></dc:creator><pubDate>Thu, 06 Oct 2005 09:12:16 GMT</pubDate></item><item><title><![CDATA[Reply to Iterieren durch STL-List und dabei löschen on Thu, 06 Oct 2005 11:04:49 GMT]]></title><description><![CDATA[<p>Wenn es nach dem Muster abläuft wie schon dir beschrieben kann man auch einen STL Algo nehmen. Also ich meine das</p>
<pre><code>- Für jeden Eintrag in der Liste
|-- Wenn Bedingung X erfüllt
  |-- Lösche aktuellen Eintrag
</code></pre>
<p>Das geht dann so:</p>
<pre><code class="language-cpp">#include &lt;list&gt;
#include &lt;iostream&gt;
#include &lt;algorithm&gt;

using namespace std;

int main()
{
	std::list&lt;int&gt; list;

	/* Liste mit Daten füllen ... */

	list.remove_if(std::bind2nd(std::equal_to&lt;int&gt;(), 0));
	std::copy(list.begin(), list.end(), std::ostream_iterator&lt;int&gt;(std::cout, &quot; &quot;));

}
</code></pre>
<p>Ich bin der Meinung dass man hier die STL nutzen sollte.</p>
<p>Gruß</p>
]]></description><link>https://www.c-plusplus.net/forum/post/886317</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/886317</guid><dc:creator><![CDATA[FireFlow]]></dc:creator><pubDate>Thu, 06 Oct 2005 11:04:49 GMT</pubDate></item><item><title><![CDATA[Reply to Iterieren durch STL-List und dabei löschen on Thu, 06 Oct 2005 11:19:29 GMT]]></title><description><![CDATA[<p>remove_if löscht aber nicht, sondern verschiebt nur. Da müsste dann noch ein list.erase( i, list.end()) her.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/886320</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/886320</guid><dc:creator><![CDATA[7H3 N4C3R]]></dc:creator><pubDate>Thu, 06 Oct 2005 11:19:29 GMT</pubDate></item><item><title><![CDATA[Reply to Iterieren durch STL-List und dabei löschen on Thu, 06 Oct 2005 11:53:28 GMT]]></title><description><![CDATA[<p>7H3 N4C3R schrieb:</p>
<blockquote>
<p>remove_if löscht aber nicht, sondern verschiebt nur. Da müsste dann noch ein list.erase( i, list.end()) her.</p>
</blockquote>
<p>Hör auf mich zu verunsichern...</p>
<p>The C++ Standard Library schrieb:</p>
<blockquote>
<p>Operation - Effect<br />
c.remove_if(op) - Removes all elements for which op(elem) yields true</p>
</blockquote>
<p>Warum sollte das Elemente nicht entfernen? Und wo sollten sie hingehen? <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="😮"
    /> <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="🙄"
    /><br />
Der Unterschied zwischen erase / remove(_if) ist dass erase einen Iterator will und remove(_if) ein Value.</p>
<p>Gruß</p>
]]></description><link>https://www.c-plusplus.net/forum/post/886352</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/886352</guid><dc:creator><![CDATA[FireFlow]]></dc:creator><pubDate>Thu, 06 Oct 2005 11:53:28 GMT</pubDate></item><item><title><![CDATA[Reply to Iterieren durch STL-List und dabei löschen on Thu, 06 Oct 2005 12:36:27 GMT]]></title><description><![CDATA[<p>Aber nicht nur die halbe Geschichte erzählen <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>Remove_if removes from the range [first, last) every element x such that pred(x) is true. That is, <strong>remove_if returns an iterator new_last such that the range [first, new_last) contains no elements for which pred is true. [1] The iterators in the range [new_last, last) are all still dereferenceable, but the elements that they point to are unspecified.</strong> Remove_if is stable, meaning that the relative order of elements that are not removed is unchanged.</p>
<p>Ich hoffe das macht deutlich, dass die Elemente im Container immernoch da sind.</p>
<p>Beispielcode aus der SGI-Doku, wo du dein Zitat wohl auch her hast:</p>
<pre><code class="language-cpp">copy(V.begin(), V.end(), ostream_iterator&lt;int&gt;(cout, &quot; &quot;));
    // The output is &quot;1 4 2 8 5 7&quot;

vector&lt;int&gt;::iterator new_end = 
        remove_if(V.begin(), V.end(), 
                  compose1(bind2nd(equal_to&lt;int&gt;(), 0),
                           bind2nd(modulus&lt;int&gt;(), 2)));
V.erase(new_end, V.end()); [1]

copy(V.begin(), V.end(), ostream_iterator&lt;int&gt;(cout, &quot; &quot;));
    // The output is &quot;1 5 7&quot;.
</code></pre>
<p>Gruß</p>
]]></description><link>https://www.c-plusplus.net/forum/post/886389</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/886389</guid><dc:creator><![CDATA[7H3 N4C3R]]></dc:creator><pubDate>Thu, 06 Oct 2005 12:36:27 GMT</pubDate></item><item><title><![CDATA[Reply to Iterieren durch STL-List und dabei löschen on Thu, 06 Oct 2005 12:37:53 GMT]]></title><description><![CDATA[<p>Nana ich rede von std::list::remove_if und nicht von std::remove_if, das ist schon ein Unterschied, vor allem da std::list::remove_if überhauptkein Rückgabewert hat. Ich bin mir nicht sicher ob das Verhalten von std::remove_if auf eine std::list definiert ist.</p>
<p>Edit: Achja ich hab in The C++ Standard Library - A Tutorial and Reference von Nicolai M. Josuttis.</p>
<p>Gruß</p>
]]></description><link>https://www.c-plusplus.net/forum/post/886395</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/886395</guid><dc:creator><![CDATA[FireFlow]]></dc:creator><pubDate>Thu, 06 Oct 2005 12:37:53 GMT</pubDate></item><item><title><![CDATA[Reply to Iterieren durch STL-List und dabei löschen on Thu, 06 Oct 2005 12:40:43 GMT]]></title><description><![CDATA[<p>Argh, verguckt. <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="😮"
    /> <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f921.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--clown_face"
      title=":clown:"
      alt="🤡"
    /><br />
Okay dann hast Du natürlich recht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/886399</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/886399</guid><dc:creator><![CDATA[7H3 N4C3R]]></dc:creator><pubDate>Thu, 06 Oct 2005 12:40:43 GMT</pubDate></item></channel></rss>