<?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[&amp;quot;Iterator&amp;quot;-Problem - wie am schönsten umgehen?]]></title><description><![CDATA[<p>Hallo,<br />
einige kenne vielleicht folgende Situation. Gibt es konkrete Lösungsansätze, um solche Probleme zu umgehen?</p>
<pre><code class="language-cpp">std::map&lt;int, string&gt; test;

// kann auch von außen aufgerufen werden
void remove(int i)
{
	std::map&lt;int, string&gt;::iterator it = test.find(i);

	if (it != test.end())
	{
		system.notify_remove(i);
		plugins.raise_event(&quot;notify_remove&quot;, i);
		// mach sonst noch irgendwelche komplizierte Sachen...

		test.erase(it);
	}
}

// wird zyklisch aufgerufen
void check_validity()
{
	for (std::map&lt;int, string&gt;::iterator it = test.begin(); it != test.end(); ++it)
	{
		if (system.is_invalid(it-&gt;first))
		{
			remove(it-&gt;first); // PROBLEM!
		}
	}
}
</code></pre>
<p>Ich habe eine solche Situation schon sehr oft gehabt und musste dann duplizierenden Code schreiben. Gibt es dafür Patterns o.Ä.?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/284668/quot-iterator-quot-problem-wie-am-schönsten-umgehen</link><generator>RSS for Node</generator><lastBuildDate>Fri, 21 Aug 2026 22:06:30 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/284668.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 05 Apr 2011 20:35:00 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to &amp;quot;Iterator&amp;quot;-Problem - wie am schönsten umgehen? on Tue, 05 Apr 2011 20:35:00 GMT]]></title><description><![CDATA[<p>Hallo,<br />
einige kenne vielleicht folgende Situation. Gibt es konkrete Lösungsansätze, um solche Probleme zu umgehen?</p>
<pre><code class="language-cpp">std::map&lt;int, string&gt; test;

// kann auch von außen aufgerufen werden
void remove(int i)
{
	std::map&lt;int, string&gt;::iterator it = test.find(i);

	if (it != test.end())
	{
		system.notify_remove(i);
		plugins.raise_event(&quot;notify_remove&quot;, i);
		// mach sonst noch irgendwelche komplizierte Sachen...

		test.erase(it);
	}
}

// wird zyklisch aufgerufen
void check_validity()
{
	for (std::map&lt;int, string&gt;::iterator it = test.begin(); it != test.end(); ++it)
	{
		if (system.is_invalid(it-&gt;first))
		{
			remove(it-&gt;first); // PROBLEM!
		}
	}
}
</code></pre>
<p>Ich habe eine solche Situation schon sehr oft gehabt und musste dann duplizierenden Code schreiben. Gibt es dafür Patterns o.Ä.?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2045189</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2045189</guid><dc:creator><![CDATA[theliquidwave]]></dc:creator><pubDate>Tue, 05 Apr 2011 20:35:00 GMT</pubDate></item><item><title><![CDATA[Reply to &amp;quot;Iterator&amp;quot;-Problem - wie am schönsten umgehen? on Tue, 05 Apr 2011 20:42:50 GMT]]></title><description><![CDATA[<p>Wo genau ist denn jetzt das Problem? Wenn es dir darum geht, daß du den Iterator doppelt ermitteln mußt, kannst du ja auch den Iterator als Parameter übergeben:</p>
<pre><code class="language-cpp">void remove(int i)
{
    std::map&lt;int, string&gt;::iterator it = test.find(i);

    if (it != test.end())
    {
        remove(it);
    }
}

void remove(std::map&lt;int, string&gt;::iterator pos
{
    system.notify_remove(pos-&gt;second);
    // mach sonst noch irgendwelche komplizierte Sachen...

    test.erase(pos);
}

void check_validity()
{
    for (std::map&lt;int, string&gt;::iterator it = test.begin(); it != test.end(); ++it)
    {
        if (system.is_invalid(it-&gt;first))
        {
            remove(it); // PROBLEM!
        }
    }
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2045193</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2045193</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Tue, 05 Apr 2011 20:42:50 GMT</pubDate></item><item><title><![CDATA[Reply to &amp;quot;Iterator&amp;quot;-Problem - wie am schönsten umgehen? on Tue, 05 Apr 2011 20:48:45 GMT]]></title><description><![CDATA[<p>Vielleicht solltest du das Problem etwas genauer erläutern, ich habe jedenfalls zwei Minuten lang versucht rauszufinden, wo da irgendetwas zyklisch aufgerufen werden soll.</p>
<p>Ich schätze, es geht darum, dass remove den Iterator in check_validity() invalidiert? Das kannst du umgehen, indem du den Iterator vor dem Aufruf inkrementierst.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2045200</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2045200</guid><dc:creator><![CDATA[Athar]]></dc:creator><pubDate>Tue, 05 Apr 2011 20:48:45 GMT</pubDate></item></channel></rss>