<?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[Listenelement löschen]]></title><description><![CDATA[<p>Hallo!</p>
<p>Ich habe eine Liste die ich mithilfe einer for Schleife und einem Iterator durchgehe. Eine if Bedingung die sich im inneren der Schleife befindet entscheidet darüber ob das Element auf das der Iterator zeigt gelöscht wird oder nicht. Ich erhalte dann dauernd einen Fehler(wenn ein Element gelöscht wird) da ja der Iterator auf nichts mehr zeigt und dadurch meine Bedingung zum Abbruch der for SChleife nicht mehr überprüft werden kann. Ich habe versucht das ich nach dem löschen wieder auf den begin der Liste zeigen zu lasse, aber das bringt nichts.<br />
Hatt irgendjemand bitte eine Lösung für das Problem?</p>
<pre><code class="language-cpp">for(iter=liste-&gt;begin();iter != liste-&gt;end();iter++){

		if(iter &gt; x){
			liste-&gt;remove(iter);
			iter=liste-&gt;begin();
		}
    }
</code></pre>
<p>Mfg</p>
<p>Dosunmu</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/183427/listenelement-löschen</link><generator>RSS for Node</generator><lastBuildDate>Wed, 23 Sep 2026 08:39:23 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/183427.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 04 Jun 2007 20:25:16 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Listenelement löschen on Mon, 04 Jun 2007 20:26:09 GMT]]></title><description><![CDATA[<p>Hallo!</p>
<p>Ich habe eine Liste die ich mithilfe einer for Schleife und einem Iterator durchgehe. Eine if Bedingung die sich im inneren der Schleife befindet entscheidet darüber ob das Element auf das der Iterator zeigt gelöscht wird oder nicht. Ich erhalte dann dauernd einen Fehler(wenn ein Element gelöscht wird) da ja der Iterator auf nichts mehr zeigt und dadurch meine Bedingung zum Abbruch der for SChleife nicht mehr überprüft werden kann. Ich habe versucht das ich nach dem löschen wieder auf den begin der Liste zeigen zu lasse, aber das bringt nichts.<br />
Hatt irgendjemand bitte eine Lösung für das Problem?</p>
<pre><code class="language-cpp">for(iter=liste-&gt;begin();iter != liste-&gt;end();iter++){

		if(iter &gt; x){
			liste-&gt;remove(iter);
			iter=liste-&gt;begin();
		}
    }
</code></pre>
<p>Mfg</p>
<p>Dosunmu</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1298899</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1298899</guid><dc:creator><![CDATA[dosunmu]]></dc:creator><pubDate>Mon, 04 Jun 2007 20:26:09 GMT</pubDate></item><item><title><![CDATA[Reply to Listenelement löschen on Mon, 04 Jun 2007 21:13:48 GMT]]></title><description><![CDATA[<p>Du sagst es ja bereits, du möchtest das Objekt auf das der Iterator &quot;zeigt&quot; überprüfen also musst du auch das nette Sternchen vor iter setzten, also so: *iter. Im moment loescht du nämlich deinen Iterator und das es dann zu Zugriffsverletzungen kommt ist klar;)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1298934</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1298934</guid><dc:creator><![CDATA[guennne]]></dc:creator><pubDate>Mon, 04 Jun 2007 21:13:48 GMT</pubDate></item><item><title><![CDATA[Reply to Listenelement löschen on Tue, 05 Jun 2007 09:21:32 GMT]]></title><description><![CDATA[<p>Wenn du alle Elemente löschen willst, die größer als x sind geht doch auch das hier.</p>
<pre><code class="language-cpp">liste-&gt;remove_if(bind2nd(greater&lt;typ&gt;(),(x)));
</code></pre>
<p>Noch zur Erweiterung von dem was guennne sagte<br />
remove löscht die angegebenen Objekte (und zwar alle).<br />
erase löscht das Objekt auf welches der Iterator zeigt den du übergibst.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1299123</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1299123</guid><dc:creator><![CDATA[Braunstein]]></dc:creator><pubDate>Tue, 05 Jun 2007 09:21:32 GMT</pubDate></item><item><title><![CDATA[Reply to Listenelement löschen on Tue, 05 Jun 2007 13:36:54 GMT]]></title><description><![CDATA[<p>ich würde es mit erase löschen, remove sucht die liste nochmal durch...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1299325</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1299325</guid><dc:creator><![CDATA[turing_mob]]></dc:creator><pubDate>Tue, 05 Jun 2007 13:36:54 GMT</pubDate></item><item><title><![CDATA[Reply to Listenelement löschen on Tue, 05 Jun 2007 13:50:17 GMT]]></title><description><![CDATA[<p>Wenn du mit erase ein Element löschst bekommst do als Rückgabewert das nächste Element, also könnte man das z.B. so machen.</p>
<pre><code class="language-cpp">iter = liste-&gt;begin();
while(iter != liste-&gt;end()){         
  if(iter &gt; x){ 
    iter = liste-&gt;erase(iter); 
  }else{
    iter++;
  } 
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1299334</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1299334</guid><dc:creator><![CDATA[Tanren]]></dc:creator><pubDate>Tue, 05 Jun 2007 13:50:17 GMT</pubDate></item><item><title><![CDATA[Reply to Listenelement löschen on Tue, 05 Jun 2007 14:00:52 GMT]]></title><description><![CDATA[<p>besser...</p>
<pre><code>for ( iter = liste.begin(); iter != liste.end(); ++it )
  if ( (*iter) &gt; x )
    liste.erase(iter);
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1299344</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1299344</guid><dc:creator><![CDATA[turing_mob]]></dc:creator><pubDate>Tue, 05 Jun 2007 14:00:52 GMT</pubDate></item><item><title><![CDATA[Reply to Listenelement löschen on Tue, 05 Jun 2007 14:16:07 GMT]]></title><description><![CDATA[<p>turing_mob schrieb:</p>
<blockquote>
<p>besser...</p>
<pre><code>for ( iter = liste.begin(); iter != liste.end(); ++it )
  if ( (*iter) &gt; x )
    liste.erase(iter);
</code></pre>
</blockquote>
<p><img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/26a0.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--warning"
      title=":warning:"
      alt="⚠"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1299353</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1299353</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Tue, 05 Jun 2007 14:16:07 GMT</pubDate></item><item><title><![CDATA[Reply to Listenelement löschen on Tue, 05 Jun 2007 14:56:22 GMT]]></title><description><![CDATA[<p>was soll daran gefährlich sein? abgesehen davon, dass der iterator einmal falsch geschrieben ist?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1299395</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1299395</guid><dc:creator><![CDATA[turing_mob]]></dc:creator><pubDate>Tue, 05 Jun 2007 14:56:22 GMT</pubDate></item><item><title><![CDATA[Reply to Listenelement löschen on Tue, 05 Jun 2007 15:14:40 GMT]]></title><description><![CDATA[<p>Weil dein Iterator nach dem erase ungültig wird und so auch nicht mehr inkrementiert werden kann.<br />
So sollte es gehen.</p>
<pre><code class="language-cpp">iter = liste.erase(iter);
</code></pre>
<p>Was gefällt euch eigentlich an meiner Lösung oben nicht? <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title=":("
      alt="😞"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1299405</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1299405</guid><dc:creator><![CDATA[Braunstein]]></dc:creator><pubDate>Tue, 05 Jun 2007 15:14:40 GMT</pubDate></item><item><title><![CDATA[Reply to Listenelement löschen on Tue, 05 Jun 2007 15:18:18 GMT]]></title><description><![CDATA[<p>Braunstein schrieb:</p>
<blockquote>
<p>Weil dein Iterator nach dem erase ungültig wird und so auch nicht mehr inkrementiert werden kann.<br />
So sollte es gehen.</p>
<pre><code class="language-cpp">iter = liste.erase(iter);
</code></pre>
</blockquote>
<p>Schon besser <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="🙂"
    /> Aber da ist immer noch ein Fehler ...</p>
<p>Braunstein schrieb:</p>
<blockquote>
<p>Was gefällt euch eigentlich an meiner Lösung oben nicht? <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title=":("
      alt="😞"
    /></p>
</blockquote>
<p>Die ist zu schööön <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/1299407</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1299407</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Tue, 05 Jun 2007 15:18:18 GMT</pubDate></item><item><title><![CDATA[Reply to Listenelement löschen on Tue, 05 Jun 2007 18:14:44 GMT]]></title><description><![CDATA[<p>Stimmt. Man muss den Iterator noch zuweisen. Ich war wohl bei Windowslisten, dort findet das Inkrementieren teilweise automatisch statt.</p>
<p>Braunstein, deine Lösung ist bestimmt richtig. Aber ich finde sie drückt rein semantisch kaum die Absicht des Algorithmus aus. Jemand, der diesen Code liest, wird zunächst nicht verstehen, was eigentlich gemeint ist, ohne irgendwo nachschlagen zu müssen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1299512</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1299512</guid><dc:creator><![CDATA[turing_mob]]></dc:creator><pubDate>Tue, 05 Jun 2007 18:14:44 GMT</pubDate></item><item><title><![CDATA[Reply to Listenelement löschen on Tue, 05 Jun 2007 18:36:50 GMT]]></title><description><![CDATA[<p>Meinst du so ?</p>
<pre><code class="language-cpp">for ( iter = liste.begin(); iter != liste.end(); ++it ) 
  if ( (*iter) &gt; x ) 
    iter = liste.erase(iter);
</code></pre>
<p>das waere aber auch nicht richtig da jedesmal wenn ein Element geloescht wird das naechste uebersprungen wird.<br />
Also du hast z.B. die Elemente 1,2,3,4 und 2 wird geloescht dann wird der iterator aufs naechste Element gesetzt also 3 dann kommt der naechste Schleifen-Durchlauf, iter wird inkrementiert und steht jetzt auf 4. Fuer die 3 wuerde also die Bedingung gar nie geprueft werden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1299530</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1299530</guid><dc:creator><![CDATA[Tanren]]></dc:creator><pubDate>Tue, 05 Jun 2007 18:36:50 GMT</pubDate></item><item><title><![CDATA[Reply to Listenelement löschen on Tue, 05 Jun 2007 18:53:04 GMT]]></title><description><![CDATA[<p>Tanren schrieb:</p>
<blockquote>
<p>Meinst du so ?</p>
<pre><code class="language-cpp">for ( iter = liste.begin(); iter != liste.end(); ++it ) 
  if ( (*iter) &gt; x ) 
    iter = liste.erase(iter);
</code></pre>
<p>das waere aber auch nicht richtig da jedesmal wenn ein Element geloescht wird das naechste uebersprungen wird.<br />
Also du hast z.B. die Elemente 1,2,3,4 und 2 wird geloescht dann wird der iterator aufs naechste Element gesetzt also 3 dann kommt der naechste Schleifen-Durchlauf, iter wird inkrementiert und steht jetzt auf 4. Fuer die 3 wuerde also die Bedingung gar nie geprueft werden.</p>
</blockquote>
<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="😉"
    /></p>
<p>Sollte also demnach besser so aussehen:</p>
<pre><code class="language-cpp">for ( list&lt;int&gt;::iterator iter = a.begin(), next = iter; iter != a.end(); iter = next )
{
    ++next;
    if ( (*iter) &gt; 3 )
        a.erase(iter);

}
</code></pre>
<p>turing_mob schrieb:</p>
<blockquote>
<p>Braunstein, deine Lösung ist bestimmt richtig. Aber ich finde sie drückt rein semantisch kaum die Absicht des Algorithmus aus. Jemand, der diesen Code liest, wird zunächst nicht verstehen, was eigentlich gemeint ist, ohne irgendwo nachschlagen zu müssen.</p>
</blockquote>
<p>Braunstein schrieb:</p>
<blockquote>
<pre><code class="language-cpp">liste-&gt;remove_if(bind2nd(greater&lt;typ&gt;(),(x)));
</code></pre>
</blockquote>
<p>liste -- lösche wenn -- größer als x<br />
Mit ein bisschen Phantasie geht das schon <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="😉"
    /> ( bind2nd mal ignoriert <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/1299536</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1299536</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Tue, 05 Jun 2007 18:53:04 GMT</pubDate></item></channel></rss>