<?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[Iteratorelement löschen innerhalb der eigenen Iteratorschleife]]></title><description><![CDATA[<p>Hallo liebe Problemlöser,</p>
<p>ich habe mir folgendes Problem angelacht:<br />
Mit den Iteratoren iter1 und iter2 wird mit 2 Forschleifen über die pClusterList gegangen. Sozusagen wird jeder Cluster mit jedem verglichen. Es findetn ein continue statt, wenn beide Cluster gleich sind. Das Ziel ist 2 Cluster zu mergen, die kleiner als ein Vorgabewert voneinander entfernt sind. Seltsamerweise hat dieser Code im Studio 2003 funktioniert nur bekomme ich im VS 2008 nun den Fehler, den ich unter dem Code beschreibe.</p>
<pre><code class="language-cpp">list&lt;CCluster*&gt;::iterator iter2;
list&lt;CCluster*&gt;::iterator iter1;

	for (iter1 = pClusterList-&gt;begin(); iter1 != pClusterList-&gt;end(); iter1++) {
		pCi = *iter1;
		if ((pCi-&gt;pointList.size() &lt; 1))
			continue;
		for (iter2 = pClusterList-&gt;begin(); iter2 != pClusterList-&gt;end(); iter2++) {
			pCj = *iter2;
			if ((pCj-&gt;pointList.size() &lt; 1) || (pCi == pCj)) 
				continue;
			// Get closest point pair distance
			/*...berechne distanz, wenn diese kleiner ist als fMinDist Merge die Beiden Cluster (Punktelisten)...*/
			if (fDistance &gt; fMinDist)
				continue;
			// Merge clusters
			for (pointIter1 = pCj-&gt;pointList.begin(); pointIter1 != pCj-&gt;pointList.end(); pointIter1++){
				pMi = (PointToTrack*) *pointIter1;
				pCi-&gt;addPoint(pMi);  //hinzufügen des Punktes
			} // for
			delete *iter2;
			pClusterList-&gt;erase(iter2++);
		} // for
	} // for
</code></pre>
<p>In Zeile 17 - 20 findet das eigentlich Mergen statt, danach soll der Cluster, welcher gerade einem anderen hinzugefügt wurde gelöst werden, wie in den Zeilen 21 und 22. Das Problem dabei ist ein wie ihn VS 2008 nennt &quot;Expression: list iterator not incrementable&quot;. Soweit so gut, der Fehler liegt also daran, dass ich den iter2 in Zeile 22 erhöhe und er dann nochmals am For-Schleifenstart (zeile <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f60e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--smiling_face_with_sunglasses"
      title="8)"
      alt="😎"
    /> erhöht wird. Bei einer Anzahl von 2 Clustern in der &quot;pClusterList&quot; zeigt iter2 dann irgendwohin nur nicht ans Ende von pClusterList.<br />
Frage: Wie also kann ich den eben hinzugefügten Cluster aus der Liste löschen ohne dabei überläufe zubekommen?<br />
Der Code ist eigentlich recht simpel und leicht verständlich, mir fehlt aber wohl das technische know-how um hier eine Lösung zu finden.</p>
<p>Über eure Hilfe wäre ich sehr dankbar.<br />
Grüße</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/220662/iteratorelement-löschen-innerhalb-der-eigenen-iteratorschleife</link><generator>RSS for Node</generator><lastBuildDate>Tue, 06 Oct 2026 23:08:40 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/220662.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 19 Aug 2008 12:22:41 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Iteratorelement löschen innerhalb der eigenen Iteratorschleife on Tue, 19 Aug 2008 12:22:41 GMT]]></title><description><![CDATA[<p>Hallo liebe Problemlöser,</p>
<p>ich habe mir folgendes Problem angelacht:<br />
Mit den Iteratoren iter1 und iter2 wird mit 2 Forschleifen über die pClusterList gegangen. Sozusagen wird jeder Cluster mit jedem verglichen. Es findetn ein continue statt, wenn beide Cluster gleich sind. Das Ziel ist 2 Cluster zu mergen, die kleiner als ein Vorgabewert voneinander entfernt sind. Seltsamerweise hat dieser Code im Studio 2003 funktioniert nur bekomme ich im VS 2008 nun den Fehler, den ich unter dem Code beschreibe.</p>
<pre><code class="language-cpp">list&lt;CCluster*&gt;::iterator iter2;
list&lt;CCluster*&gt;::iterator iter1;

	for (iter1 = pClusterList-&gt;begin(); iter1 != pClusterList-&gt;end(); iter1++) {
		pCi = *iter1;
		if ((pCi-&gt;pointList.size() &lt; 1))
			continue;
		for (iter2 = pClusterList-&gt;begin(); iter2 != pClusterList-&gt;end(); iter2++) {
			pCj = *iter2;
			if ((pCj-&gt;pointList.size() &lt; 1) || (pCi == pCj)) 
				continue;
			// Get closest point pair distance
			/*...berechne distanz, wenn diese kleiner ist als fMinDist Merge die Beiden Cluster (Punktelisten)...*/
			if (fDistance &gt; fMinDist)
				continue;
			// Merge clusters
			for (pointIter1 = pCj-&gt;pointList.begin(); pointIter1 != pCj-&gt;pointList.end(); pointIter1++){
				pMi = (PointToTrack*) *pointIter1;
				pCi-&gt;addPoint(pMi);  //hinzufügen des Punktes
			} // for
			delete *iter2;
			pClusterList-&gt;erase(iter2++);
		} // for
	} // for
</code></pre>
<p>In Zeile 17 - 20 findet das eigentlich Mergen statt, danach soll der Cluster, welcher gerade einem anderen hinzugefügt wurde gelöst werden, wie in den Zeilen 21 und 22. Das Problem dabei ist ein wie ihn VS 2008 nennt &quot;Expression: list iterator not incrementable&quot;. Soweit so gut, der Fehler liegt also daran, dass ich den iter2 in Zeile 22 erhöhe und er dann nochmals am For-Schleifenstart (zeile <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f60e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--smiling_face_with_sunglasses"
      title="8)"
      alt="😎"
    /> erhöht wird. Bei einer Anzahl von 2 Clustern in der &quot;pClusterList&quot; zeigt iter2 dann irgendwohin nur nicht ans Ende von pClusterList.<br />
Frage: Wie also kann ich den eben hinzugefügten Cluster aus der Liste löschen ohne dabei überläufe zubekommen?<br />
Der Code ist eigentlich recht simpel und leicht verständlich, mir fehlt aber wohl das technische know-how um hier eine Lösung zu finden.</p>
<p>Über eure Hilfe wäre ich sehr dankbar.<br />
Grüße</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1567511</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1567511</guid><dc:creator><![CDATA[bananaslip]]></dc:creator><pubDate>Tue, 19 Aug 2008 12:22:41 GMT</pubDate></item><item><title><![CDATA[Reply to Iteratorelement löschen innerhalb der eigenen Iteratorschleife on Tue, 19 Aug 2008 12:37:24 GMT]]></title><description><![CDATA[<p>Hier liegt der Hase begraben: pClusterList-&gt;erase(iter2++);<br />
Armer Hase...</p>
<p>Im Grunde läuft es so:</p>
<pre><code class="language-cpp">for(iter = v.begin(); iter != v.end(); /* ... */)
{
  // ...
  if(wegdamit)
  {
    iter = v.erase(iter);
  }
  else
  {
    ++iter;
  }
}
</code></pre>
<p>Also mit der Rückgabe von erase arbeiten.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1567528</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1567528</guid><dc:creator><![CDATA[Fellhuhn]]></dc:creator><pubDate>Tue, 19 Aug 2008 12:37:24 GMT</pubDate></item><item><title><![CDATA[Reply to Iteratorelement löschen innerhalb der eigenen Iteratorschleife on Tue, 19 Aug 2008 12:41:43 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">pClusterList-&gt;erase(iter2++);
</code></pre>
<p>das würde ich so schreiben:</p>
<pre><code class="language-cpp">iter2 = ClusterList-&gt;erase(iter2);
</code></pre>
<p>mach es so:</p>
<pre><code class="language-cpp">iter2 = pClusterList-&gt;erase(iter2);
if (iter2 == pClusterList-&gt;End())
    break;
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1567533</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1567533</guid><dc:creator><![CDATA[helferlein]]></dc:creator><pubDate>Tue, 19 Aug 2008 12:41:43 GMT</pubDate></item><item><title><![CDATA[Reply to Iteratorelement löschen innerhalb der eigenen Iteratorschleife on Tue, 19 Aug 2008 12:46:01 GMT]]></title><description><![CDATA[<p>Solange das iter2++ in der Schleife nicht verschwindet, wird er nach jeder Löschung ein Element überspringen, da erase einen Iterator auf das nächste Element zurückgibt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1567538</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1567538</guid><dc:creator><![CDATA[Fellhuhn]]></dc:creator><pubDate>Tue, 19 Aug 2008 12:46:01 GMT</pubDate></item><item><title><![CDATA[Reply to Iteratorelement löschen innerhalb der eigenen Iteratorschleife on Tue, 19 Aug 2008 12:48:29 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">for (iter1 = pClusterList-&gt;begin(); iter1 != pClusterList-&gt;end(); ++iter1) {
        pCi = *iter1;
        if ((pCi-&gt;pointList.size() &lt; 1))
            continue;
        for (iter2 = iter1, ++iter2; iter2 != pClusterList-&gt;end(); ) {
            pCj = *iter2;
            if ((pCj-&gt;pointList.size() &lt; 1) || distance(pCi,pCj) &gt; fMinDist )
            {
                ++iter2;
                continue;
            } // hier ließe sich auch find_if einsetzen
            // Merge clusters
            for (pointIter1 = pCj-&gt;pointList.begin(); pointIter1 != pCj-&gt;pointList.end(); pointIter1++){
                pMi = (PointToTrack*) *pointIter1;
                pCi-&gt;addPoint(pMi);  //hinzufügen des Punktes
            } // for
            pClusterList-&gt;erase(iter2++);
            delete pCj;
        } // for
    }
</code></pre>
<p>Baue kleinere Funktionen, und solche Dinge werden einfach.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1567539</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1567539</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Tue, 19 Aug 2008 12:48:29 GMT</pubDate></item><item><title><![CDATA[Reply to Iteratorelement löschen innerhalb der eigenen Iteratorschleife on Tue, 19 Aug 2008 12:55:06 GMT]]></title><description><![CDATA[<p>Ok ich werd die guten Tipps gleich umsetzen, melde mich mit Ergebnissen ...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1567547</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1567547</guid><dc:creator><![CDATA[bananaslip]]></dc:creator><pubDate>Tue, 19 Aug 2008 12:55:06 GMT</pubDate></item><item><title><![CDATA[Reply to Iteratorelement löschen innerhalb der eigenen Iteratorschleife on Tue, 19 Aug 2008 13:36:06 GMT]]></title><description><![CDATA[<p>Also ich wollte es ja nicht so recht glauben, aber mein Kollege meinte das wäre das beste Forum überhaupt.<br />
Aussage Bestätigt!!</p>
<p>Solved: Mit dem Vorschlag von helferlein</p>
<pre><code class="language-cpp">iter2 = pClusterList-&gt;erase(iter2);
if (iter2 == pClusterList-&gt;End())
    break;
</code></pre>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/6642">@camper</a>, deine Version werde ich auch noch ausprobieren, da ich aber unter Zeitdruck stehe muss es jetzt erstmal so tun.</p>
<p>Thx leutz!</p>
<p>...Ne doch keine Lösung siehe weiter unten</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1567557</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1567557</guid><dc:creator><![CDATA[bananaslip]]></dc:creator><pubDate>Tue, 19 Aug 2008 13:36:06 GMT</pubDate></item><item><title><![CDATA[Reply to Iteratorelement löschen innerhalb der eigenen Iteratorschleife on Tue, 19 Aug 2008 13:18:00 GMT]]></title><description><![CDATA[<p>bananaslip schrieb:</p>
<blockquote>
<pre><code class="language-cpp">iter2 = pClusterList-&gt;erase(iter2);
if (iter2 == pClusterList-&gt;End())
    break;
</code></pre>
</blockquote>
<p>Wenn dich so etwas nicht erschaudern lässt, weise ich einfach mal darauf hin, dass du so das Element nach einem gelöschten Element überspringst. Zwar ist deine innere Schleife ohnehin ineffizient, da so jede Paarung doppelt geprüft wird, und somit eine Chance besteht, dass das übersprungene Element doch noch einmal behandelt wird, gibt es dafür keine Garantie (hast du 4 aufeinanderfolgende Elemente, die zu mergen wären, wird das Letzte übersehen werden). Natürlich kann man auch das <em>flicken</em></p>
<pre><code class="language-cpp">iter2 = pClusterList-&gt;erase(iter2);
if (iter2 == pClusterList-&gt;End())
    break;
--iter2; // iter2 kann an dieser Stelle nicht pClusterList-&gt;begin() sein
</code></pre>
<p>Was davon zu halten ist, brauche ich hoffentlich nicht zu schreiben...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1567561</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1567561</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Tue, 19 Aug 2008 13:18:00 GMT</pubDate></item><item><title><![CDATA[Reply to Iteratorelement löschen innerhalb der eigenen Iteratorschleife on Tue, 19 Aug 2008 13:22:00 GMT]]></title><description><![CDATA[<p>Ach du schande, hab ich voll übersehen. Ok dann wohl doch sofort mal mit deiner Lösung angefangen...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1567570</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1567570</guid><dc:creator><![CDATA[bananaslip]]></dc:creator><pubDate>Tue, 19 Aug 2008 13:22:00 GMT</pubDate></item><item><title><![CDATA[Reply to Iteratorelement löschen innerhalb der eigenen Iteratorschleife on Tue, 19 Aug 2008 14:20:17 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/6642">@camper</a>,<br />
ich dachte doch tatsächlich du hättest gerade <em>ficken</em> geschrieben. Zeit für Feierabend...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1567625</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1567625</guid><dc:creator><![CDATA[Fellhuhn]]></dc:creator><pubDate>Tue, 19 Aug 2008 14:20:17 GMT</pubDate></item><item><title><![CDATA[Reply to Iteratorelement löschen innerhalb der eigenen Iteratorschleife on Wed, 20 Aug 2008 10:38:03 GMT]]></title><description><![CDATA[<p>Ok hier der ganze Code wie er jetzt ist und auch funktioniert...</p>
<pre><code class="language-cpp">for (iter1 = pClusterList-&gt;begin(); iter1 != pClusterList-&gt;end(); iter1++) {
	pCi = *iter1;
	if ((pCi-&gt;pointList.size() &lt; 1)) //|| (pCi-&gt;nType == nTypePedestrian))
		continue;
	for (iter2 = iter1, ++iter2; iter2 != pClusterList-&gt;end(); ) { 
		pCj = *iter2;
		if ((pCj-&gt;pointList.size() &lt; 1) || (pCi == pCj)) { 
			++iter2;
			continue;
		}
		// Get closest point pair distance
		double fDistance = 1000;
		for (pointIter1 = pCi-&gt;pointList.begin(); pointIter1 != pCi-&gt;pointList.end(); pointIter1++) 
			for (pointIter2 = pCj-&gt;pointList.begin(); pointIter2 != pCj-&gt;pointList.end(); pointIter2++)
				fDistance = min2 (fDistance, distanceXY(*pointIter1, *pointIter2));
		if (fDistance &gt; fMinDist) {
			++iter2;
			continue;
		}
		// Merge clusters
		for (pointIter1 = pCj-&gt;pointList.begin(); pointIter1 != pCj-&gt;pointList.end(); pointIter1++){
			pMi = (PointToTrack*) *pointIter1;
			pCi-&gt;addPoint(pMi);
		} // for
		pClusterList-&gt;erase(iter2++);
		delete pCj; 
	} // for
} // for
</code></pre>
<p>Danke ncohmal an alle für die Hilfe</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1568118</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1568118</guid><dc:creator><![CDATA[bananaslip]]></dc:creator><pubDate>Wed, 20 Aug 2008 10:38:03 GMT</pubDate></item></channel></rss>