<?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[Standardproblem mit STL listen.]]></title><description><![CDATA[<p>Hy<br />
Bin nun schon mehrfach über ein Problem mit listen aus der STL gestolpert.<br />
Was ich machen will ist sowas:</p>
<p>typedef list&lt;something&gt; list_t;<br />
list_t mylist;</p>
<p>for(list_t::iterator i=mylist.begin(); i!=mylist.end();i++)<br />
{<br />
myfunction(i);<br />
};</p>
<p>soweit, sogut, das gibt aber probleme wenn myfunction elemente aus mylist löscht, da i invalid wird, wenn gerade dieses element gelöscht wird. Einfacher workaround:</p>
<p>list_t::iterator j;<br />
list_t::iterator i=mylist.begin();<br />
while(i!=mylist.end())<br />
{<br />
j=i;i++;<br />
myfunction(j);<br />
};</p>
<p>Das funktioniert aber leider nicht, da sich beim löschen eines elementes anscheinend auch end() ändert, und die schleife das ende der Liste verpasst(i wird nie gleich end() <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="😞"
    /> ), wenn myfunction das letzt element löscht.</p>
<p>Habe bisher bei jedem speziellen fall dieses Problems ein workaround gefunden,<br />
frage mich aber, ob es nicht eine allgemeine, elegante und schnelle Lösung gibt.<br />
Bin auf eure Vorschläge gespannt <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="🙂"
    /> . Danke, blubbersprudel.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/165926/standardproblem-mit-stl-listen</link><generator>RSS for Node</generator><lastBuildDate>Tue, 15 Sep 2026 05:27:27 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/165926.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 24 Nov 2006 10:50:09 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Standardproblem mit STL listen. on Fri, 24 Nov 2006 10:50:09 GMT]]></title><description><![CDATA[<p>Hy<br />
Bin nun schon mehrfach über ein Problem mit listen aus der STL gestolpert.<br />
Was ich machen will ist sowas:</p>
<p>typedef list&lt;something&gt; list_t;<br />
list_t mylist;</p>
<p>for(list_t::iterator i=mylist.begin(); i!=mylist.end();i++)<br />
{<br />
myfunction(i);<br />
};</p>
<p>soweit, sogut, das gibt aber probleme wenn myfunction elemente aus mylist löscht, da i invalid wird, wenn gerade dieses element gelöscht wird. Einfacher workaround:</p>
<p>list_t::iterator j;<br />
list_t::iterator i=mylist.begin();<br />
while(i!=mylist.end())<br />
{<br />
j=i;i++;<br />
myfunction(j);<br />
};</p>
<p>Das funktioniert aber leider nicht, da sich beim löschen eines elementes anscheinend auch end() ändert, und die schleife das ende der Liste verpasst(i wird nie gleich end() <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="😞"
    /> ), wenn myfunction das letzt element löscht.</p>
<p>Habe bisher bei jedem speziellen fall dieses Problems ein workaround gefunden,<br />
frage mich aber, ob es nicht eine allgemeine, elegante und schnelle Lösung gibt.<br />
Bin auf eure Vorschläge gespannt <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="🙂"
    /> . Danke, blubbersprudel.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1180599</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1180599</guid><dc:creator><![CDATA[blubbersprudel]]></dc:creator><pubDate>Fri, 24 Nov 2006 10:50:09 GMT</pubDate></item><item><title><![CDATA[Reply to Standardproblem mit STL listen. on Fri, 24 Nov 2006 11:11:08 GMT]]></title><description><![CDATA[<p>Hallo blubbersprudel,</p>
<p>die erase() Funktion der STL-List liefert Dir doch einen Iterator zurück der auf das erste Element zeigt das den gelöschten Elementen folgt. Du must diesen nur auffangen.Z. B.</p>
<pre><code class="language-cpp">void myfunction(list_t::iterator &amp;i)
{
    // ...
    i = myList.erase(i, i+2);
    // ...
}

for (list_t::iterator i = myList.begin(), i &lt; myList.end(), i++)
{
    myfunction(i);
}
</code></pre>
<p>Ist nur ne Skizze, aber so ungefähr müsste es funktionieren. Ich hoffe das hilft Dir weiter...</p>
<p>Viele Grüße<br />
Knecht</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1180621</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1180621</guid><dc:creator><![CDATA[Knecht]]></dc:creator><pubDate>Fri, 24 Nov 2006 11:11:08 GMT</pubDate></item><item><title><![CDATA[Reply to Standardproblem mit STL listen. on Fri, 24 Nov 2006 11:17:55 GMT]]></title><description><![CDATA[<p>Zum Löschen verwendest du sicherlich die Methode 'erase'? Diese gibt einen iterator zurück, welchen du dann weiterverwenden kannst, z.B.</p>
<pre><code class="language-cpp">for(list_t::iterator it=mylist.begin(); it!=mylist.end(); ++it) 
{
    it = mylist.erase(it);
};
</code></pre>
<p>Wenn du eine Funktion verwendest, sollte diese dann den iterator zurückliefern.</p>
<p>Außerdem ist eine std::list so definiert (und programmiert), daß sich die Speicheradressen der einzelnen Elemente nicht ändern.</p>
<p>P.S. Du solltest beim Inkrementieren den Präfix-Operator (++it) verwenden, da dieser effizienter als der Postfix-Operator (it++) ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1180623</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1180623</guid><dc:creator><![CDATA[Th]]></dc:creator><pubDate>Fri, 24 Nov 2006 11:17:55 GMT</pubDate></item><item><title><![CDATA[Reply to Standardproblem mit STL listen. on Fri, 24 Nov 2006 11:30:15 GMT]]></title><description><![CDATA[<p>Da hab ich wohl was übersehen <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="😃"
    /> .<br />
werds mal so probieren, obwohl das zurücklifern des zeigers nicht leicht wird (sind viele verschachtelte objekte beteiligt)<br />
Vielen Dank für die flotte Antwort <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/1180627</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1180627</guid><dc:creator><![CDATA[blubbersprudel]]></dc:creator><pubDate>Fri, 24 Nov 2006 11:30:15 GMT</pubDate></item><item><title><![CDATA[Reply to Standardproblem mit STL listen. on Fri, 24 Nov 2006 14:46:37 GMT]]></title><description><![CDATA[<p>Th schrieb:</p>
<blockquote>
<p>P.S. Du solltest beim Inkrementieren den Präfix-Operator (++it) verwenden, da dieser effizienter als der Postfix-Operator (it++) ist.</p>
</blockquote>
<p>was ? warum ?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1180765</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1180765</guid><dc:creator><![CDATA[EXDW]]></dc:creator><pubDate>Fri, 24 Nov 2006 14:46:37 GMT</pubDate></item><item><title><![CDATA[Reply to Standardproblem mit STL listen. on Fri, 24 Nov 2006 14:50:33 GMT]]></title><description><![CDATA[<p>Ne, end ändert sich nicht. Das Problem ist nur, dass Du unter Umständen in der Schleife erhöhst und dann am Ende nochmal, damit läufste drüber raus.</p>
<p>Aus Listen Elemente zu entfernen invalidiert nur Iteratoren auf das entfernte Listenelement.</p>
<pre><code class="language-cpp">for (list_t::iterator i = myList.begin(); i &lt; myList.end();)
{
    myfunction(i++);
}
</code></pre>
<p>Und die Sache ist erledigt. <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/1180769</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1180769</guid><dc:creator><![CDATA[Jester]]></dc:creator><pubDate>Fri, 24 Nov 2006 14:50:33 GMT</pubDate></item><item><title><![CDATA[Reply to Standardproblem mit STL listen. on Mon, 27 Nov 2006 07:47:12 GMT]]></title><description><![CDATA[<p>Mr Evil schrieb:</p>
<blockquote>
<p>Th schrieb:</p>
<blockquote>
<p>P.S. Du solltest beim Inkrementieren den Präfix-Operator (++it) verwenden, da dieser effizienter als der Postfix-Operator (it++) ist.</p>
</blockquote>
<p>was ? warum ?</p>
</blockquote>
<p>i++ muß eine temporäre Variable anlegen und per Wert übergeben (per Definition liefert der Postfix-Inkrement den alten Wert zurück, ++i gibt lediglich eine Referenz auf den neuen Wert. Wenn du also nicht auf den Rückgabewert des Inkrement-Operators angewiesen bist, kannst du dir die Kopiererei ersparen.</p>
<p>und ein typischer Post-Inc sieht so aus:</p>
<pre><code class="language-cpp">Typ Typ::operator++(int)//das int hat keine Funktion, sondern grenzt nur ab zwischen Prä-Inc und Post-Inc
{
  Typ tmp = *this;
  ++*this;//nutzt Prä-Inc
  return tmp;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1182029</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1182029</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Mon, 27 Nov 2006 07:47:12 GMT</pubDate></item></channel></rss>