<?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[erase und remove aus der stl]]></title><description><![CDATA[<p>Hallo,</p>
<p>und zwar durchlaufe ich einen Vektor und möchten einen gefundenen Wert löschen. Dann soll er den Durchlauf weiter fortsetzen, bis ich alle gefundenen Werte gelöscht habe. Der neue Vektor hat logischer Weise weniger Werte. Irgendwie hab ich eine Endlosschleife, der kommt nicht zum Ende bei mir. Woran liegt das? <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>
<pre><code class="language-cpp">...

PointVector collectPoints;
PointVector::iterator findIt;
for( findIt=allPoints.begin() ; findIt!=allPoints.end() ;  )
{
  if ( ... )
  {
    collectPoints.push_back(*findIt);
    allPoints.erase(remove(allPoints.begin(), allPoints.end(), *findIt), allPoints.end());
  }
}

...
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/topic/222294/erase-und-remove-aus-der-stl</link><generator>RSS for Node</generator><lastBuildDate>Mon, 05 Oct 2026 04:09:42 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/222294.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 10 Sep 2008 12:52:09 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to erase und remove aus der stl on Wed, 10 Sep 2008 12:52:09 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>und zwar durchlaufe ich einen Vektor und möchten einen gefundenen Wert löschen. Dann soll er den Durchlauf weiter fortsetzen, bis ich alle gefundenen Werte gelöscht habe. Der neue Vektor hat logischer Weise weniger Werte. Irgendwie hab ich eine Endlosschleife, der kommt nicht zum Ende bei mir. Woran liegt das? <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>
<pre><code class="language-cpp">...

PointVector collectPoints;
PointVector::iterator findIt;
for( findIt=allPoints.begin() ; findIt!=allPoints.end() ;  )
{
  if ( ... )
  {
    collectPoints.push_back(*findIt);
    allPoints.erase(remove(allPoints.begin(), allPoints.end(), *findIt), allPoints.end());
  }
}

...
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1579731</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1579731</guid><dc:creator><![CDATA[Mister Wing]]></dc:creator><pubDate>Wed, 10 Sep 2008 12:52:09 GMT</pubDate></item><item><title><![CDATA[Reply to erase und remove aus der stl on Wed, 10 Sep 2008 12:56:41 GMT]]></title><description><![CDATA[<p>Du veränderst findIt nicht?</p>
<pre><code class="language-cpp">//...
if (sollWasLöschen)
  findIt = vector.erase(*findIt);
else
  ++findIt;
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1579735</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1579735</guid><dc:creator><![CDATA[Fellhuhn]]></dc:creator><pubDate>Wed, 10 Sep 2008 12:56:41 GMT</pubDate></item><item><title><![CDATA[Reply to erase und remove aus der stl on Wed, 10 Sep 2008 13:05:27 GMT]]></title><description><![CDATA[<p>- Erstens ist es zwar lobesam dass du deinen Code reduzierst, allerdings ist hier die Bedingung im if von Interesse.<br />
- Zweitens ist im Code nicht zu sehen dass du irgendwas mit findIt machst, der Iterator würde also immer auf allPoints.begin() stehen, wenn nicht...<br />
- ... Drittens: solltest du anders als im Code gezeigt findIt irgendwo in allPoints positionieren, kann dir der Aufruf von remove() ein Ergebnis liefern, das vor findit liegt. Der Aufruf von erase() macht in dem Fall den iterator findIt ungültig. Der nächste Zugriff darauf erzeugt undefiniertes Verhalten, und wenn man von undefiniertem Verhalten spricht ist eine Endlosschleife noch harmlos (rein theoretisch wäre es durchaus mit dem Standard vereinbar wenn der Rechner versucht, das Schlumpfenlied auf dem PC-Speaker zu spielen...)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1579738</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1579738</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Wed, 10 Sep 2008 13:05:27 GMT</pubDate></item><item><title><![CDATA[Reply to erase und remove aus der stl on Wed, 10 Sep 2008 13:09:44 GMT]]></title><description><![CDATA[<p>Pumuckl redet von den Schlümpfen? Ich glaube die Hölle friert zu!</p>
<p>Überhaupt habe ich noch nie gesehen das der Rückgabewert von remove an erase übergeben wird...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1579743</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1579743</guid><dc:creator><![CDATA[Fellhuhn]]></dc:creator><pubDate>Wed, 10 Sep 2008 13:09:44 GMT</pubDate></item><item><title><![CDATA[Reply to erase und remove aus der stl on Wed, 10 Sep 2008 13:11:58 GMT]]></title><description><![CDATA[<p>Kleiner Fehler:</p>
<p>Fellhuhn schrieb:</p>
<blockquote>
<pre><code class="language-cpp">findIt = vector.erase(*findIt);
</code></pre>
</blockquote>
<p>müsste so sein: <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>
<pre><code class="language-cpp">findIt = vector.erase(findIt);
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1579744</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1579744</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Wed, 10 Sep 2008 13:11:58 GMT</pubDate></item><item><title><![CDATA[Reply to erase und remove aus der stl on Wed, 10 Sep 2008 13:14:42 GMT]]></title><description><![CDATA[<p>Die if-Bedingung enthält einen Wert den ich suche. Wenn ich den gefunden habe übergebe ich ihm <em>collectPoints</em> und will ihn aus <em>allPoints</em>löschen. Bloss die Adresse von <em>allPoints</em> ändert sich doch am Ende. Mit dem Rückgabewert von remove sag ich ihm doch den neuen Endwert an. Oder?! So hab ich es verstanden in der stl.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1579746</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1579746</guid><dc:creator><![CDATA[Mister Wing]]></dc:creator><pubDate>Wed, 10 Sep 2008 13:14:42 GMT</pubDate></item><item><title><![CDATA[Reply to erase und remove aus der stl on Wed, 10 Sep 2008 13:27:53 GMT]]></title><description><![CDATA[<p>Es ist dir aber bewusst, dass ein STL-Algorithmus namens <code>find()</code> existiert, der Elemente sucht und einen Iterator auf das erste gefundene Element zurückgibt?</p>
<p>Dann kannst du den nämlich zuerst dereferenzieren und per <code>push_back()</code> anhängen, dann mit <code>erase()</code> aus dem alten Vector löschen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1579754</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1579754</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Wed, 10 Sep 2008 13:27:53 GMT</pubDate></item><item><title><![CDATA[Reply to erase und remove aus der stl on Wed, 10 Sep 2008 13:27:40 GMT]]></title><description><![CDATA[<p>Nexus schrieb:</p>
<blockquote>
<p>Kleiner Fehler:</p>
<p>Fellhuhn schrieb:</p>
<blockquote>
<pre><code class="language-cpp">findIt = vector.erase(*findIt);
</code></pre>
</blockquote>
<p>müsste so sein: <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>
<pre><code class="language-cpp">findIt = vector.erase(findIt);
</code></pre>
</blockquote>
<p>Soll doch spannend bleiben. <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><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/33042">@Wing</a><br />
remove entfernt alle Elemente in der Range der ersten beiden Parameter die dem dritten entsprechend. vec.erase hingegen löscht nur ein Element und das zwar das, dessen Iterator ihm da übergeben wird. erase gibt dann einen Iterator auf das Element HINTER dem gelöschten zurück. Deswegen wird nur in dem Fall, in dem nichts gelöscht wird, der Iterator manuell verschoben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1579755</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1579755</guid><dc:creator><![CDATA[Fellhuhn]]></dc:creator><pubDate>Wed, 10 Sep 2008 13:27:40 GMT</pubDate></item><item><title><![CDATA[Reply to erase und remove aus der stl on Wed, 10 Sep 2008 13:50:55 GMT]]></title><description><![CDATA[<p>Fellhuhn schrieb:</p>
<blockquote>
<p>Du veränderst findIt nicht?</p>
<pre><code class="language-cpp">//...
if (sollWasLöschen)
  findIt = vector.erase(*findIt);
else
  ++findIt;
</code></pre>
</blockquote>
<p>Fast, da wir hier ein range-erase mit dem Resultat von remove durchführen wollen, ist der Rückgabewert von erase allerdings uninteressant (nämlich immer end(), und nicht das Folgeelement der Ursprungssequenz). Tatsächlich ist das ohne Kenntnis der Löschbedingung nicht so ohne Weiteres zu korrigieren. Einfach wird es nur, wenn die Löschbedingung derart ist, dass sie immer gleich für das erste gefundene Element erfüllt ist. Dann können wir nebenbei auch den Anwendungsbereich von remove einengen.</p>
<pre><code class="language-cpp">for( findIt=allPoints.begin() ; findIt!=allPoints.end() ;  )
{
  if ( ... )
  {
    collectPoints.push_back(*findIt);
 // collectPoints.back statt *findIT um ggf. mit defekten Implementierungen umzugehen, die remove zu naiv implementieren (Vergleichsobjekt ist selbst Element der Sequenz)
    PointVector::iterator erase_begin = remove(findIt, allPoints.end(), collectPoints.back());
    if ( erase_begin == findIt )
    {
        vector.erase(erase_begin, allPoints.end());
    // sowohl erase_begin als auch findIt sind hier ungültig, deshalb mussten wir den Test vor dem erase durchführen, auch wenn das zu einer gewissen
    // Codeduplizität führt
        break;
    }
    vector.erase(erase_begin, allPoints.end());
    // das ursprüngliche Objekt bei *findIt wurde durch remove durch das Folgelement der Ursprungssequenz ersetzt, hier ist also nichts mehr zu tun
  }
// alternativ
//  bool reached_end = ( erase_begin == findIt );
//  vector.erase(erase_begin, allPoints.end());
//  if ( reached_end )
//    break;
// .. wahrscheinlich sogar besser so
  else
    ++findIt;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1579756</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1579756</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Wed, 10 Sep 2008 13:50:55 GMT</pubDate></item><item><title><![CDATA[Reply to erase und remove aus der stl on Wed, 10 Sep 2008 13:47:27 GMT]]></title><description><![CDATA[<p>Was spricht gegen:</p>
<pre><code class="language-cpp">PointVector::iterator first_invalid_element;
first_invalid_element = remove(allPoints.begin(), allPoints.end(), my_value);
allPoints.erase(first_invalid_element, allPoints.end());
</code></pre>
<p>?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1579760</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1579760</guid><dc:creator><![CDATA[Turing]]></dc:creator><pubDate>Wed, 10 Sep 2008 13:47:27 GMT</pubDate></item><item><title><![CDATA[Reply to erase und remove aus der stl on Wed, 10 Sep 2008 13:48:28 GMT]]></title><description><![CDATA[<p>camper schrieb:</p>
<blockquote>
<p>Fast, da wir hier ein range-erase mit dem Resultat von remove durchführen wollen, ist der Rückgabewert von erase allerdings uninteressant (nämlich immer end(), und nicht das Folgeelement der Ursprungssequenz). Tatsächlich ist das ohne Kenntnis der Löschbedingung nicht so ohne Weiteres zu korrigieren. Einfach wird es nur, wenn die Löschbedingung derart ist, dass sie immer gleich für das erste gefundene Element erfüllt ist. Dann können wir nebenbei auch den Anwendungsbereich von remove einengen.</p>
</blockquote>
<p>Wo steht denn was von range-erase? Hab ich das überlesen? Auch &quot;vector&quot; aus deinem Beispiel gibt es nicht in seinem.</p>
<p>Ich verstehe sein Eingangsposting eher so das er alle Elemente auf die if(...) zutrifft aus allPoints entfernt und dafür in collectPoints einfügen will. Nicht mehr.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1579761</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1579761</guid><dc:creator><![CDATA[Fellhuhn]]></dc:creator><pubDate>Wed, 10 Sep 2008 13:48:28 GMT</pubDate></item><item><title><![CDATA[Reply to erase und remove aus der stl on Wed, 10 Sep 2008 14:00:11 GMT]]></title><description><![CDATA[<p>Fellhuhn schrieb:</p>
<blockquote>
<p>camper schrieb:</p>
<blockquote>
<p>Fast, da wir hier ein range-erase mit dem Resultat von remove durchführen wollen, ist der Rückgabewert von erase allerdings uninteressant (nämlich immer end(), und nicht das Folgeelement der Ursprungssequenz). Tatsächlich ist das ohne Kenntnis der Löschbedingung nicht so ohne Weiteres zu korrigieren. Einfach wird es nur, wenn die Löschbedingung derart ist, dass sie immer gleich für das erste gefundene Element erfüllt ist. Dann können wir nebenbei auch den Anwendungsbereich von remove einengen.</p>
</blockquote>
<p>Wo steht denn was von range-erase? Hab ich das überlesen? Auch &quot;vector&quot; aus deinem Beispiel gibt es nicht in seinem.</p>
<p>Ich verstehe sein Eingangsposting eher so das er alle Elemente auf die if(...) zutrifft aus allPoints entfernt und dafür in collectPoints einfügen will. Nicht mehr.</p>
</blockquote>
<p>vector=allPoints - dummer C&amp;P-Effekt aus deinem Posting</p>
<p>Der Range-erase-Aufruf steht im ersten Beitrag.</p>
<p>nochmal korrigiert und übersichtlicher, an den Erklärungen ändert sich nichts</p>
<pre><code class="language-cpp">PointVector::iterator findIt=allPoints.begin();
for( bool reached_end = ( findIt == allPoints.end() ); !reached_end ;  )
{
  if ( ... )
  {
    collectPoints.push_back(*findIt);
    PointVector::iterator erase_begin = remove(findIt, allPoints.end(), collectPoints.back());
    reached_end = ( erase_begin == findIt );
    allPoints.erase(erase_begin, allPoints.end());
  }
  else
    reached_end = ( ++findIt == allPoints.end() );
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1579766</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1579766</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Wed, 10 Sep 2008 14:00:11 GMT</pubDate></item><item><title><![CDATA[Reply to erase und remove aus der stl on Wed, 10 Sep 2008 14:06:13 GMT]]></title><description><![CDATA[<p>Also, welche von den ganzen Vorschlägen ist nun die Lösung meines Problems?</p>
<p>1. Wert gefunden in allPoints<br />
2. den gefunden Wert in coolectPoints einfügen, dabei aber aus allPoints löschen<br />
3. weiter gehen bis zum nächsten gefunden Wert, Schritt und 1 und 2 wiederholen<br />
4. bis Ende erreicht ist<br />
5. wenn allPoints irgendwann wieder aufgerufen wird, dann sollen diese gelöschten Punkte nicht vorhanden sein</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1579774</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1579774</guid><dc:creator><![CDATA[Mister Wing]]></dc:creator><pubDate>Wed, 10 Sep 2008 14:06:13 GMT</pubDate></item><item><title><![CDATA[Reply to erase und remove aus der stl on Wed, 10 Sep 2008 14:12:52 GMT]]></title><description><![CDATA[<p>Dann reicht das was ich geschrieben hatte.</p>
<pre><code class="language-cpp">if (sollWasLöschen){
  collectPoints.push_back(*findIt);
  findIt = allPoints.erase(*findIt);
}else{
  ++findIt; 
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1579780</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1579780</guid><dc:creator><![CDATA[Fellhuhn]]></dc:creator><pubDate>Wed, 10 Sep 2008 14:12:52 GMT</pubDate></item><item><title><![CDATA[Reply to erase und remove aus der stl on Wed, 10 Sep 2008 14:21:58 GMT]]></title><description><![CDATA[<p>Fellhuhn schrieb:</p>
<blockquote>
<p>Dann reicht das was ich geschrieben hatte.</p>
<pre><code class="language-cpp">if (sollWasLöschen){
  collectPoints.push_back(*findIt);
  findIt = allPoints.erase(*findIt);
}else{
  ++findIt; 
}
</code></pre>
</blockquote>
<p>vector hat keine erase-Funktion, die als Argument ein Objekt des Elementtyps benutzt. Und falls es diese Funktion gäbe, und diese alle Vorkommen des Arguments aus dem vector löschte, verbliebe immer noch die Frage, welche Bedeutung der Rückgabewert bei mehreren gelöschten Elementen haben müsste (womit gleich die Erklärung gegeben ist, warum es diese Funktion nur für assoziative Container gibt).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1579785</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1579785</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Wed, 10 Sep 2008 14:21:58 GMT</pubDate></item><item><title><![CDATA[Reply to erase und remove aus der stl on Wed, 10 Sep 2008 14:26:32 GMT]]></title><description><![CDATA[<p>Also bei mir stürzt er ab nach Fellhunhs Lösung.</p>
<pre><code class="language-cpp">vector&lt;int&gt; vec;

	for(int i = 1; i&lt; 13; i++)
		vec.push_back(i);

	vector&lt;int&gt;::iterator it;
	for ( it = vec.begin() ; it!=vec.end() ; )
	{
		if ( (4-*it == 0) || (9-*it == 0)  )
		{	
			cout &lt;&lt; &quot;Geloeschter Wert : &quot; &lt;&lt; *it &lt;&lt; endl;
			it = vec.erase(it);			 
		}
		else
			it++;

		cout &lt;&lt; *it &lt;&lt; endl;
	}

	vec.~vector();
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1579788</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1579788</guid><dc:creator><![CDATA[Mister Wing]]></dc:creator><pubDate>Wed, 10 Sep 2008 14:26:32 GMT</pubDate></item><item><title><![CDATA[Reply to erase und remove aus der stl on Wed, 10 Sep 2008 14:28:14 GMT]]></title><description><![CDATA[<p>Weil du bei deinem cout am Ende der Schleife im letzten Durchlauf quasi *vec.end() machst.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1579790</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1579790</guid><dc:creator><![CDATA[Fellhuhn]]></dc:creator><pubDate>Wed, 10 Sep 2008 14:28:14 GMT</pubDate></item><item><title><![CDATA[Reply to erase und remove aus der stl on Wed, 10 Sep 2008 14:35:31 GMT]]></title><description><![CDATA[<p>Ok. Lösung gefunden. So ists recht. Vielen Dank Fellhuhn.</p>
<p>Thread kann geschlossen werden. <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="🙂"
    /> <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="🙂"
    /> <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="🙂"
    /> <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/1579801</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1579801</guid><dc:creator><![CDATA[Mister Wing]]></dc:creator><pubDate>Wed, 10 Sep 2008 14:35:31 GMT</pubDate></item><item><title><![CDATA[Reply to erase und remove aus der stl on Wed, 10 Sep 2008 14:35:40 GMT]]></title><description><![CDATA[<p>Mister Wing schrieb:</p>
<blockquote>
<p>Also bei mir stürzt er ab nach Fellhunhs Lösung.</p>
<pre><code class="language-cpp">vec.~vector();
</code></pre>
</blockquote>
<p>Ist nicht dein Ernst?! <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/1579802</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1579802</guid><dc:creator><![CDATA[Der Bär]]></dc:creator><pubDate>Wed, 10 Sep 2008 14:35:40 GMT</pubDate></item><item><title><![CDATA[Reply to erase und remove aus der stl on Wed, 10 Sep 2008 14:48:04 GMT]]></title><description><![CDATA[<p>Na doch, weil ich ein paar Programmzeilen mehr habe und ich ihn an dieser Stelle zerstören muss.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1579813</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1579813</guid><dc:creator><![CDATA[Mister Wing]]></dc:creator><pubDate>Wed, 10 Sep 2008 14:48:04 GMT</pubDate></item><item><title><![CDATA[Reply to erase und remove aus der stl on Wed, 10 Sep 2008 14:56:24 GMT]]></title><description><![CDATA[<p>Ich hatte das so interpretiert, dass die Ausgabesequenz keine Duplikate enthalten darf (als Konsequenz des remove-Aufrufs).<br />
Fellhuhns korrigierte Variante funktioniert, hat aber quadratische Komplexität.<br />
Besser wäre</p>
<pre><code class="language-cpp">struct is_candidate_for_collection : std::unary_function&lt;int,bool&gt;
{
    bool operator(int v) const { return v == 9 || v == 4; }
};

...
// Kopiere alle Kandidaten nach collectPoints:
remove_copy_if(allPoints.begin(),allPoints.end(),std::back_inserter(collectPoints),std::not1(is_candidate_for_collection()));
// Lösche alle Vorkommen in allPoints
allPoints.erase(remove_if(allPoints.begin(),allPoints.end(),is_candidate_for_collection()),allPoints.end());

// oder wir schreiben uns einen eigenen single-pass Algorithmus
template&lt;class ForwardIterator, class OutputIterator, class Predicate&gt;
ForwardIterator split_copy_if(ForwardIterator first, ForwardIterator last,OutputIterator out, Predicate pred)
{
    ForwardIterator i = std::find_if(first,last,pred);
    if ( i == last )
        return i;
    for ( *out = *i, ++out, first = i, ++first; first != last; ++first )
    {
        if ( pred( *first ) )
        {
            *out = *first;
            ++out;
        }
        else
        {
            *i = *first;
            ++i;
        }
    }
    return i;
}
// mithin
allPoints.erase(split_copy_if(allPoints.begin(),allPoints.end(),std::back_inserter(collectPoints),is_candidate_for_collection()),allPoints.end());
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1579817</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1579817</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Wed, 10 Sep 2008 14:56:24 GMT</pubDate></item></channel></rss>