<?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[Pointer in einer Map aktualisieren]]></title><description><![CDATA[<p>Hallo Leute,</p>
<p>ich habe vor Allem ein konzeptuelles Problem und mein Gehirn ist gerade schon ein Knäuel, deshalb hier die Suche nach Hilfe.</p>
<p>Die Situation: Ich verwalte in einer Map Pointer auf Cluster/Gruppen von Pixeln, die jeweils über einen Index identifiziert werden (key der der Map)</p>
<pre><code class="language-cpp">struct Cluster
{
	int	nNumberOfPixel;
	int	nIndex;
        ...
};

map&lt;int,Cluster*&gt; mapCluster;
</code></pre>
<p>Das mit den Pointern auf die Map ist notwendig, weil es sonst zu langsam wird.<br />
Zusätzlich habe ich die Cluster in einer Liste, sortiert nach der Anzahl an Punkten.</p>
<p>In einer Schleife wird nun, am Anfang der Liste beginnend, geschaut, welches Cluster am besten zu einem anderen passt und die beiden zusammengefügt, sprich Zahl der Pixel addiert und noch anderes.</p>
<p>Zusätzlich wird die Map aktualisiert, in dem der Zeiger von dem alten Cluster(was in das andere einfließt) nun auf das neue Cluster zeigt.<br />
Nun zu meinem eigentlichen Problem: Wird das Cluster, was bereits ein anderes sich einverleibt hat in ein anderes integriert, wird der zuvor geänderte Zeiger, vom ersten Cluster nicht mitverändert und zeigt entweder auf das alte Objekt, das nicht mehr gültig ist oder ins Nichts (wollte eigentlich das alte Objekt löschen, da es ja nicht mehr gebraucht wird)</p>
<p>Kurzer Beispielcode, wie er aktuell ist:</p>
<pre><code class="language-cpp">...
list&lt;Cluster&gt; lCluster;
list&lt;Cluster&gt;::iterator iIter = lCluster.begin(),
				iMinimalVariance, iIterIn, 
				iIterEnd = lCluster.end();

for(; lCluster.size() &gt; nNumOfCluster/4;)
{
	iIterIn = lCluster.begin();
	iIterIn++;
	iMinimalVariance = lCluster.begin();

	  for(; iIterIn != iIterEnd; ++iIterIn)
          {
            //Suche Cluster mit geringstem Unterschied -&gt; iMinimalVariance
	  }

	int oldIndex = 
	mapCluster[iMinimalVariance-&gt;nIndex]-&gt;merge(*mapCluster[iIter-&gt;nIndex]);

	delete mapCluster[iIter-&gt;nIndex];	

	mapCluster[iIter-&gt;nIndex] = mapCluster[iMinimalVariance-&gt;nIndex];

	lCluster.pop_front();
	iIter = lCluster.begin();
}
...
</code></pre>
<p>Ich hatte überlegt, ob man sowas irgendwie über Pointer auf Pointer lösen kann, aber im Endeffekt komme ich immer beim gleichen Problem raus, halt nur 1-2 Schritte später. Oder ich erzeuge einen weiteren Container im Cluster, der sich merkt, wer alles auf ihn referenziert. Das finde ich aber irgendwie auch nicht so praktikabel. Die Geschwindigkeit ist halt schon von Bedeutung.<br />
Kennt ihr da eine gute Herangehensweise oder denke ich allgemein zu kompliziert? Das Problem sollte doch eigentlich nicht so untypisch sein, aber ich finde einfach nichts dazu.</p>
<p>Gruß,<br />
Mopple</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/291144/pointer-in-einer-map-aktualisieren</link><generator>RSS for Node</generator><lastBuildDate>Mon, 17 Aug 2026 22:26:21 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/291144.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 11 Aug 2011 14:42:18 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Pointer in einer Map aktualisieren on Thu, 11 Aug 2011 14:42:18 GMT]]></title><description><![CDATA[<p>Hallo Leute,</p>
<p>ich habe vor Allem ein konzeptuelles Problem und mein Gehirn ist gerade schon ein Knäuel, deshalb hier die Suche nach Hilfe.</p>
<p>Die Situation: Ich verwalte in einer Map Pointer auf Cluster/Gruppen von Pixeln, die jeweils über einen Index identifiziert werden (key der der Map)</p>
<pre><code class="language-cpp">struct Cluster
{
	int	nNumberOfPixel;
	int	nIndex;
        ...
};

map&lt;int,Cluster*&gt; mapCluster;
</code></pre>
<p>Das mit den Pointern auf die Map ist notwendig, weil es sonst zu langsam wird.<br />
Zusätzlich habe ich die Cluster in einer Liste, sortiert nach der Anzahl an Punkten.</p>
<p>In einer Schleife wird nun, am Anfang der Liste beginnend, geschaut, welches Cluster am besten zu einem anderen passt und die beiden zusammengefügt, sprich Zahl der Pixel addiert und noch anderes.</p>
<p>Zusätzlich wird die Map aktualisiert, in dem der Zeiger von dem alten Cluster(was in das andere einfließt) nun auf das neue Cluster zeigt.<br />
Nun zu meinem eigentlichen Problem: Wird das Cluster, was bereits ein anderes sich einverleibt hat in ein anderes integriert, wird der zuvor geänderte Zeiger, vom ersten Cluster nicht mitverändert und zeigt entweder auf das alte Objekt, das nicht mehr gültig ist oder ins Nichts (wollte eigentlich das alte Objekt löschen, da es ja nicht mehr gebraucht wird)</p>
<p>Kurzer Beispielcode, wie er aktuell ist:</p>
<pre><code class="language-cpp">...
list&lt;Cluster&gt; lCluster;
list&lt;Cluster&gt;::iterator iIter = lCluster.begin(),
				iMinimalVariance, iIterIn, 
				iIterEnd = lCluster.end();

for(; lCluster.size() &gt; nNumOfCluster/4;)
{
	iIterIn = lCluster.begin();
	iIterIn++;
	iMinimalVariance = lCluster.begin();

	  for(; iIterIn != iIterEnd; ++iIterIn)
          {
            //Suche Cluster mit geringstem Unterschied -&gt; iMinimalVariance
	  }

	int oldIndex = 
	mapCluster[iMinimalVariance-&gt;nIndex]-&gt;merge(*mapCluster[iIter-&gt;nIndex]);

	delete mapCluster[iIter-&gt;nIndex];	

	mapCluster[iIter-&gt;nIndex] = mapCluster[iMinimalVariance-&gt;nIndex];

	lCluster.pop_front();
	iIter = lCluster.begin();
}
...
</code></pre>
<p>Ich hatte überlegt, ob man sowas irgendwie über Pointer auf Pointer lösen kann, aber im Endeffekt komme ich immer beim gleichen Problem raus, halt nur 1-2 Schritte später. Oder ich erzeuge einen weiteren Container im Cluster, der sich merkt, wer alles auf ihn referenziert. Das finde ich aber irgendwie auch nicht so praktikabel. Die Geschwindigkeit ist halt schon von Bedeutung.<br />
Kennt ihr da eine gute Herangehensweise oder denke ich allgemein zu kompliziert? Das Problem sollte doch eigentlich nicht so untypisch sein, aber ich finde einfach nichts dazu.</p>
<p>Gruß,<br />
Mopple</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2104922</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2104922</guid><dc:creator><![CDATA[mopple]]></dc:creator><pubDate>Thu, 11 Aug 2011 14:42:18 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer in einer Map aktualisieren on Thu, 11 Aug 2011 15:13:44 GMT]]></title><description><![CDATA[<p>Mal 'ne ganz doofe Frage: Du hast doch die Inidizes (bzw. Iteratoren) von den beiden Elementen die zusammengefasst werden. Warum löscht/änderst du die Elemente nicht? Oder habe ich dich falsch verstanden?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2104939</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2104939</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Thu, 11 Aug 2011 15:13:44 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer in einer Map aktualisieren on Thu, 11 Aug 2011 15:26:14 GMT]]></title><description><![CDATA[<p>Tu ich ja auch. Ich löschen den einen Eintrag und schreibe an die gleiche Stelle einen Verweis auf das zweite Element, was das erste aufgenommen hat. Das zweite Element wird einfach geändert und sein Zeiger bleibt bestehen.<br />
Wenn das alles nur einmal passiert ist es ja kein Problem. Das tritt erst auf, wenn dieses zweite Element wiederum von einem dritten Element aufgenommen wird. Dann sollte eigentlich der Zeiger, der ursprünglich aufs erste Element gezeigt hat nun auch auf das dritte Element zeigen. Tut er aber nicht...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2104943</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2104943</guid><dc:creator><![CDATA[mopple]]></dc:creator><pubDate>Thu, 11 Aug 2011 15:26:14 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer in einer Map aktualisieren on Thu, 11 Aug 2011 15:47:04 GMT]]></title><description><![CDATA[<p>Wenn ich Dich richtig verstehe, hast Du in der Map wie auch in der List Pointer auf gleiche Cluster (auf dem Heap). Wenn Du in der List einen Cluster aus dem Speicher entfernst, zeigt der Pointer in der Map ins Nichts. Du solltest also vor dem Löschen in der List wie in der Map die Zeiger auf den zu löschenden Cluster entfernen (erase).<br />
Gruß Helmut</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2104944</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2104944</guid><dc:creator><![CDATA[Helmut.Jakoby]]></dc:creator><pubDate>Thu, 11 Aug 2011 15:47:04 GMT</pubDate></item></channel></rss>