<?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[Wie löscht man Elemente aus std::set innerhalb einer Schleife?]]></title><description><![CDATA[<p>Hi!<br />
Ich will manche Elemente aus einer std::set löschen. Das bedeutet, dass der iterator nach dem Löschen invalidiert wird. Ist das die richtige Lösung des Problems:</p>
<pre><code class="language-cpp">set&lt;etwas&gt; sc;
/* ...	*/
for (set&lt;etwas&gt;::iterator i = sc.begin(), ie = sc.end(); i != ie; ++i)
	if ((*i)-&gt;irgendwas()) {
		set&lt;etwas&gt;::iterator temp = i;
                ++temp;
		sc.erase(i);
                i = temp;
	}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/topic/208185/wie-löscht-man-elemente-aus-std-set-innerhalb-einer-schleife</link><generator>RSS for Node</generator><lastBuildDate>Sun, 11 Oct 2026 20:12:48 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/208185.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 15 Mar 2008 20:32:52 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Wie löscht man Elemente aus std::set innerhalb einer Schleife? on Sat, 15 Mar 2008 20:32:52 GMT]]></title><description><![CDATA[<p>Hi!<br />
Ich will manche Elemente aus einer std::set löschen. Das bedeutet, dass der iterator nach dem Löschen invalidiert wird. Ist das die richtige Lösung des Problems:</p>
<pre><code class="language-cpp">set&lt;etwas&gt; sc;
/* ...	*/
for (set&lt;etwas&gt;::iterator i = sc.begin(), ie = sc.end(); i != ie; ++i)
	if ((*i)-&gt;irgendwas()) {
		set&lt;etwas&gt;::iterator temp = i;
                ++temp;
		sc.erase(i);
                i = temp;
	}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1475004</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1475004</guid><dc:creator><![CDATA[khalderon]]></dc:creator><pubDate>Sat, 15 Mar 2008 20:32:52 GMT</pubDate></item><item><title><![CDATA[Reply to Wie löscht man Elemente aus std::set innerhalb einer Schleife? on Sat, 15 Mar 2008 20:41:54 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">if((*i)-&gt;irgendwas())
{
    m.erase(i++);
}
else
{
    ++i;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1475005</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1475005</guid><dc:creator><![CDATA[schöner]]></dc:creator><pubDate>Sat, 15 Mar 2008 20:41:54 GMT</pubDate></item><item><title><![CDATA[Reply to Wie löscht man Elemente aus std::set innerhalb einer Schleife? on Sat, 15 Mar 2008 23:18:36 GMT]]></title><description><![CDATA[<p>oder du schreibst ein kleines Prädikat lokal zu der Funktion in der du die Elemente löschen willst und benutzt std::remove_if()</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1475056</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1475056</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Sat, 15 Mar 2008 23:18:36 GMT</pubDate></item><item><title><![CDATA[Reply to Wie löscht man Elemente aus std::set innerhalb einer Schleife? on Sun, 16 Mar 2008 03:25:12 GMT]]></title><description><![CDATA[<p>khalderon schrieb:</p>
<blockquote>
<p>Hi!<br />
Das bedeutet, dass der iterator nach dem Löschen invalidiert wird.</p>
</blockquote>
<p>Du hast das ein bisschen falsch verstanden ;). Nicht der Wert des Iterators wird ungültig (geht auch gar nicht, da nur eine Kopie an erase() übergeben wird), sondern das Objekt, auf das der Iterator verweist. Das bedeutet, dass das Dereferenzieren dieses Iterators nach dem Löschen zu undefiniertem Verhalten führt. Du darfst den Iterator danach gerne Inkrementieren, um zum nächsten (gültigen) Element zu kommen <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f576.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--sunglasses"
      title=":sunglasses:"
      alt="🕶"
    /> .</p>
<pre><code class="language-cpp">set&lt;etwas&gt; sc;
/* ...    */
for (set&lt;etwas&gt;::iterator i = sc.begin(), ie = sc.end(); i != ie; ++i)
{
    if ((*i)-&gt;irgendwas()) 
        sc.erase(i);
}
</code></pre>
<p>Grüße</p>
<p>Martin</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1475082</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1475082</guid><dc:creator><![CDATA[JimmydaMage]]></dc:creator><pubDate>Sun, 16 Mar 2008 03:25:12 GMT</pubDate></item><item><title><![CDATA[Reply to Wie löscht man Elemente aus std::set innerhalb einer Schleife? on Sun, 16 Mar 2008 06:48:59 GMT]]></title><description><![CDATA[<p>Toll! Danke!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1475089</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1475089</guid><dc:creator><![CDATA[khalderon]]></dc:creator><pubDate>Sun, 16 Mar 2008 06:48:59 GMT</pubDate></item><item><title><![CDATA[Reply to Wie löscht man Elemente aus std::set innerhalb einer Schleife? on Sun, 16 Mar 2008 06:55:30 GMT]]></title><description><![CDATA[<p>ist der code von JimmydaMage nicht falsch?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1475090</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1475090</guid><dc:creator><![CDATA[lololo]]></dc:creator><pubDate>Sun, 16 Mar 2008 06:55:30 GMT</pubDate></item><item><title><![CDATA[Reply to Wie löscht man Elemente aus std::set innerhalb einer Schleife? on Sun, 16 Mar 2008 07:35:32 GMT]]></title><description><![CDATA[<p>Wusste ichs doch, Visual C++ meldet bei dem Code von JimmydaMage:</p>
<p>map/set iterator not incrementable</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1475091</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1475091</guid><dc:creator><![CDATA[lololo]]></dc:creator><pubDate>Sun, 16 Mar 2008 07:35:32 GMT</pubDate></item><item><title><![CDATA[Reply to Wie löscht man Elemente aus std::set innerhalb einer Schleife? on Sun, 16 Mar 2008 10:45:23 GMT]]></title><description><![CDATA[<p>JimmydaMage schrieb:</p>
<blockquote>
<p>Du hast das ein bisschen falsch verstanden ;). Nicht der Wert des Iterators wird ungültig (geht auch gar nicht, da nur eine Kopie an erase() übergeben wird), sondern das Objekt, auf das der Iterator verweist.</p>
</blockquote>
<p>Öhm. Nein!</p>
<p><a href="http://www.velocityreviews.com/forums/t277880-setltgteraseiterator-question.html" rel="nofollow">http://www.velocityreviews.com/forums/t277880-setltgteraseiterator-question.html</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1475137</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1475137</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Sun, 16 Mar 2008 10:45:23 GMT</pubDate></item><item><title><![CDATA[Reply to Wie löscht man Elemente aus std::set innerhalb einer Schleife? on Sun, 16 Mar 2008 11:13:32 GMT]]></title><description><![CDATA[<p>Ich benutze also das:</p>
<p>schöner schrieb:</p>
<blockquote>
<pre><code class="language-cpp">if((*i)-&gt;irgendwas())
{
    m.erase(i++);
}
else
{
    ++i;
}
</code></pre>
</blockquote>
<p>i++ macht eine Kopie des Iterators die zurückgegeben wird. Danach aber wird i intern inkrementiert und so zeigt er zu dem nächsten Element <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/1475157</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1475157</guid><dc:creator><![CDATA[khalderon]]></dc:creator><pubDate>Sun, 16 Mar 2008 11:13:32 GMT</pubDate></item><item><title><![CDATA[Reply to Wie löscht man Elemente aus std::set innerhalb einer Schleife? on Sun, 16 Mar 2008 11:47:39 GMT]]></title><description><![CDATA[<p>Wieso benutzt du nicht einfach den Rückgabewert von erase()?</p>
<p>Dinkumware Compleat Reference schrieb:</p>
<blockquote>
<pre><code class="language-cpp">set::erase
iterator erase(iterator where);
</code></pre>
<p>The [...] member function removes the element of the controlled sequence pointed to by where. [...] It returns an iterator that designates the first element remaining beyond any elements removed, or end() if no such element exists.</p>
</blockquote>
<p>Dann sieht das ganze ungefähr so aus:</p>
<pre><code class="language-cpp">set&lt;etwas&gt; sc;
//...
for (set&lt;etwas&gt;::iterator it = sc.begin(), ie = sc.end(); it != ie;)
    if ((*i)-&gt;irgendwas())
    {
        it = sc.erase(it); //it wird auf das nächste Element gesetzt
    }
    else
    {
        ++it; //it wird so auch auf das nächste Element gesetzt
    }
</code></pre>
<p>Felix</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1475167</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1475167</guid><dc:creator><![CDATA[Phoemuex]]></dc:creator><pubDate>Sun, 16 Mar 2008 11:47:39 GMT</pubDate></item><item><title><![CDATA[Reply to Wie löscht man Elemente aus std::set innerhalb einer Schleife? on Sun, 16 Mar 2008 11:58:51 GMT]]></title><description><![CDATA[<p>Phoemuex schrieb:</p>
<blockquote>
<p>Wieso benutzt du nicht einfach den Rückgabewert von erase()?</p>
</blockquote>
<p>Weil bei Set <em>erase</em> keinen Rückgabewert hat. Das ist laut Standard nicht vorgeschrieben.</p>
<p><a href="http://www.cppreference.com/cppset/erase.html" rel="nofollow">http://www.cppreference.com/cppset/erase.html</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1475175</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1475175</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Sun, 16 Mar 2008 11:58:51 GMT</pubDate></item><item><title><![CDATA[Reply to Wie löscht man Elemente aus std::set innerhalb einer Schleife? on Sun, 16 Mar 2008 12:04:08 GMT]]></title><description><![CDATA[<p>Ja, das habe ich auch erfahren davon:<br />
<a href="http://www.sgi.com/tech/stl/set.html" rel="nofollow">http://www.sgi.com/tech/stl/set.html</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1475178</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1475178</guid><dc:creator><![CDATA[khalderon]]></dc:creator><pubDate>Sun, 16 Mar 2008 12:04:08 GMT</pubDate></item><item><title><![CDATA[Reply to Wie löscht man Elemente aus std::set innerhalb einer Schleife? on Sun, 16 Mar 2008 12:23:46 GMT]]></title><description><![CDATA[<p>Um meinen etwas knappen Beitrag zum Them <em>Nutze die Standardbibliothek</em> zu vervollständigen hier etwas Code:</p>
<pre><code class="language-cpp">set&lt;etwas&gt; sc;
/*...*/
struct testetwas {
  bool operator()(etwas const&amp; e) {return e.irgendwas();}
};
std::remove_if(sc.begin(), sc.end(), testetwas());
</code></pre>
<p>Da es ein etwas unbekannteres Feature von C++ ist hier eine kurze Erklärung: testetwas ist eine lokale Klasse, die direkt vor dem Aufruf von remove_if definiert werden kann, also innerhalb der Funktion, in der sie benutzt wird.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1475189</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1475189</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Sun, 16 Mar 2008 12:23:46 GMT</pubDate></item><item><title><![CDATA[Reply to Wie löscht man Elemente aus std::set innerhalb einer Schleife? on Sun, 16 Mar 2008 12:42:37 GMT]]></title><description><![CDATA[<p>pumuckl schrieb:</p>
<blockquote>
<p>Um meinen etwas knappen Beitrag zum Them <em>Nutze die Standardbibliothek</em> zu vervollständigen hier etwas Code:</p>
<pre><code class="language-cpp">set&lt;etwas&gt; sc;
/*...*/
struct testetwas {
  bool operator()(etwas const&amp; e) {return e.irgendwas();}
};
std::remove_if(sc.begin(), sc.end(), testetwas());
</code></pre>
<p>Da es ein etwas unbekannteres Feature von C++ ist hier eine kurze Erklärung: testetwas ist eine lokale Klasse, die direkt vor dem Aufruf von remove_if definiert werden kann, also innerhalb der Funktion, in der sie benutzt wird.</p>
</blockquote>
<p>Für mich ist das nicht unbekannt. Meinst du so:<br />
sc.erase(remove_if(sc.begin(), sc.end(), predikat), sc.end());?<br />
Bist du dir sicher, dass die remove_if Funktion mit set Iteratoren arbeiten kann?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1475196</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1475196</guid><dc:creator><![CDATA[khalderon]]></dc:creator><pubDate>Sun, 16 Mar 2008 12:42:37 GMT</pubDate></item><item><title><![CDATA[Reply to Wie löscht man Elemente aus std::set innerhalb einer Schleife? on Sun, 16 Mar 2008 21:46:35 GMT]]></title><description><![CDATA[<p>khalderon schrieb:</p>
<blockquote>
<p>Meinst du so:<br />
sc.erase(remove_if(sc.begin(), sc.end(), predikat), sc.end());?</p>
</blockquote>
<p>Natürlich. Unachtsamkeit meinerseits.</p>
<blockquote>
<p>Bist du dir sicher, dass die remove_if Funktion mit set Iteratoren arbeiten kann?</p>
</blockquote>
<p>Wäre schon blöd, wenn STL-Algorithmen nicht mit STL-Iteratoren arbeiten könnten oder? <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="😉"
    /> Dafür sind sie ja gemacht, würde mich also mehr als verwundern wenns das nicht tut.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1475521</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1475521</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Sun, 16 Mar 2008 21:46:35 GMT</pubDate></item><item><title><![CDATA[Reply to Wie löscht man Elemente aus std::set innerhalb einer Schleife? on Mon, 17 Mar 2008 06:18:19 GMT]]></title><description><![CDATA[<p>remove_if arbeitet nicht mit set iteratoren. Punkt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1475578</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1475578</guid><dc:creator><![CDATA[khalderon]]></dc:creator><pubDate>Mon, 17 Mar 2008 06:18:19 GMT</pubDate></item><item><title><![CDATA[Reply to Wie löscht man Elemente aus std::set innerhalb einer Schleife? on Mon, 17 Mar 2008 07:00:33 GMT]]></title><description><![CDATA[<p>khalderon schrieb:</p>
<blockquote>
<p>remove_if arbeitet nicht mit set iteratoren. Punkt.</p>
</blockquote>
<p>Richtig, weil remove_if die Reihenfolge in der Sequenz ändert. Da im set die Reihenfolge festgelegt ist, klappt das nicht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1475584</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1475584</guid><dc:creator><![CDATA[LordJaxom]]></dc:creator><pubDate>Mon, 17 Mar 2008 07:00:33 GMT</pubDate></item><item><title><![CDATA[Reply to Wie löscht man Elemente aus std::set innerhalb einer Schleife? on Mon, 17 Mar 2008 08:35:03 GMT]]></title><description><![CDATA[<p>ok, wieder was gelernt. Andere Frage: muss es überhaupt ein set sein?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1475619</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1475619</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Mon, 17 Mar 2008 08:35:03 GMT</pubDate></item><item><title><![CDATA[Reply to Wie löscht man Elemente aus std::set innerhalb einer Schleife? on Mon, 17 Mar 2008 13:05:09 GMT]]></title><description><![CDATA[<p>Ja, weil set Duplikaten nicht erlaubt. Ich muss ständig Zeiger inserten. Im Fall wenn 2 oder mehrmals die gleiche Adresse inserted wird, passiert nix schlimmes (ein counter wird intern im set inkrementiert) und meine Anwendung funktioniert einfach problemlos.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1475835</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1475835</guid><dc:creator><![CDATA[khalderon]]></dc:creator><pubDate>Mon, 17 Mar 2008 13:05:09 GMT</pubDate></item></channel></rss>