<?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[std::map-Iterator wird ungültig]]></title><description><![CDATA[<p>Hallo!</p>
<p>Ich nutze folgenden Typen:</p>
<pre><code class="language-cpp">typedef std::map&lt;std::string, MyClass&gt; MYCLASS_MAP_T;
</code></pre>
<p>MyClass ist eine eigene Klasse.<br />
Neue Einträge füge ich z.B. so hinzu</p>
<pre><code class="language-cpp">MYCLASS_MAP_T classMap;
classMap[&quot;blabla&quot;].SetValue(27);
</code></pre>
<p>Hier meine erste Frage: Ist das so richtig oder sollte ich mit .find erst herausfinden ob schon eine Instanz vorhanden ist und falls nicht dann sowas wie push_back gebrauchen?<br />
Ich hätte das jetzt so verstanden, dass die Map das für mich macht wenn &quot;blabla&quot; noch nicht vorhanden ist. Ist &quot;blabla&quot; vorhanden, so greife ich auf das bestehende Objekt zu.</p>
<p>Gut, dann iteriere ich da später durch:</p>
<pre><code class="language-cpp">MYCLASS_MAP_T::iterator itCB = ptrData-&gt;counter.begin();
			MYCLASS_MAP_T::iterator itCE = ptrData-&gt;counter.end();

			while(itCB != itCE)
			{
				// itCB-&gt;first; und itCB-&gt;second; werden hier genutzt				
				++itCB;
			}
</code></pre>
<p>Und ganz ganz ganz selten stürzt das Programm ab mit einer STL-Debugausgabe das die Iteratorentypen nicht passen (genaue Meldung leider gerade unbekannt). Irgendwo in &lt;xtree.h&gt; und in it-&gt;first steht dann wohl Unsinn.</p>
<p>Woher könnte das kommen? Werden Iteratoren ungültig wenn ich beim iterieren einen neuen Eintrag in die Map packe?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/222528/std-map-iterator-wird-ungültig</link><generator>RSS for Node</generator><lastBuildDate>Tue, 08 Sep 2026 12:55:01 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/222528.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 14 Sep 2008 00:44:57 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to std::map-Iterator wird ungültig on Sun, 14 Sep 2008 00:44:57 GMT]]></title><description><![CDATA[<p>Hallo!</p>
<p>Ich nutze folgenden Typen:</p>
<pre><code class="language-cpp">typedef std::map&lt;std::string, MyClass&gt; MYCLASS_MAP_T;
</code></pre>
<p>MyClass ist eine eigene Klasse.<br />
Neue Einträge füge ich z.B. so hinzu</p>
<pre><code class="language-cpp">MYCLASS_MAP_T classMap;
classMap[&quot;blabla&quot;].SetValue(27);
</code></pre>
<p>Hier meine erste Frage: Ist das so richtig oder sollte ich mit .find erst herausfinden ob schon eine Instanz vorhanden ist und falls nicht dann sowas wie push_back gebrauchen?<br />
Ich hätte das jetzt so verstanden, dass die Map das für mich macht wenn &quot;blabla&quot; noch nicht vorhanden ist. Ist &quot;blabla&quot; vorhanden, so greife ich auf das bestehende Objekt zu.</p>
<p>Gut, dann iteriere ich da später durch:</p>
<pre><code class="language-cpp">MYCLASS_MAP_T::iterator itCB = ptrData-&gt;counter.begin();
			MYCLASS_MAP_T::iterator itCE = ptrData-&gt;counter.end();

			while(itCB != itCE)
			{
				// itCB-&gt;first; und itCB-&gt;second; werden hier genutzt				
				++itCB;
			}
</code></pre>
<p>Und ganz ganz ganz selten stürzt das Programm ab mit einer STL-Debugausgabe das die Iteratorentypen nicht passen (genaue Meldung leider gerade unbekannt). Irgendwo in &lt;xtree.h&gt; und in it-&gt;first steht dann wohl Unsinn.</p>
<p>Woher könnte das kommen? Werden Iteratoren ungültig wenn ich beim iterieren einen neuen Eintrag in die Map packe?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1581592</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1581592</guid><dc:creator><![CDATA[mapper2000]]></dc:creator><pubDate>Sun, 14 Sep 2008 00:44:57 GMT</pubDate></item><item><title><![CDATA[Reply to std::map-Iterator wird ungültig on Sun, 14 Sep 2008 00:54:05 GMT]]></title><description><![CDATA[<p>mapper2000 schrieb:</p>
<blockquote>
<p>Ich hätte das jetzt so verstanden, dass die Map das für mich macht wenn &quot;blabla&quot; noch nicht vorhanden ist. Ist &quot;blabla&quot; vorhanden, so greife ich auf das bestehende Objekt zu.</p>
</blockquote>
<p>Genau <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>
<p>Zum anderen, das weiß ich grad nich.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1581594</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1581594</guid><dc:creator><![CDATA[Badestrand]]></dc:creator><pubDate>Sun, 14 Sep 2008 00:54:05 GMT</pubDate></item><item><title><![CDATA[Reply to std::map-Iterator wird ungültig on Sun, 14 Sep 2008 09:30:33 GMT]]></title><description><![CDATA[<p>Generell sind Interatoren der Container nicht lange gültig. Sie sind sozusagen nur für den Moment gültig, danach sollte man sich die neu besorgen. Erst Recht wenn Du noch ein Element in den Container reinschmeisst, und erst Recht bei map. Wenn du z.B. an einen Vector mit push_back was dran hängst, ist es eher unwahrscheinlich ein Iterator ungültig wird, weil der Container nicht umorganisiert werden muß, aber bei map sehr wahrscheinlich.</p>
<p>Generell sollte man sich aber Iteratoren neu besorgen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1581627</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1581627</guid><dc:creator><![CDATA[Bulli]]></dc:creator><pubDate>Sun, 14 Sep 2008 09:30:33 GMT</pubDate></item><item><title><![CDATA[Reply to std::map-Iterator wird ungültig on Sun, 14 Sep 2008 09:32:27 GMT]]></title><description><![CDATA[<p>Achja, das hier finde ich viel verständlicher, um zu sehen, was map macht, wenn kein Key vorhanden ist:</p>
<pre><code class="language-cpp">MYCLASS_MAP_T classMap; 
classMap[&quot;blabla&quot;] = 27;
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1581629</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1581629</guid><dc:creator><![CDATA[Bulli]]></dc:creator><pubDate>Sun, 14 Sep 2008 09:32:27 GMT</pubDate></item><item><title><![CDATA[Reply to std::map-Iterator wird ungültig on Sun, 14 Sep 2008 09:47:34 GMT]]></title><description><![CDATA[<p>Bulli schrieb:</p>
<blockquote>
<p>Wenn du z.B. an einen Vector mit push_back was dran hängst, ist es eher unwahrscheinlich ein Iterator ungültig wird, weil der Container nicht umorganisiert werden muß...</p>
</blockquote>
<p>Muß noch sagen, das das auch nicht ganz richtig ist: sobald natürlich intern ein neues Array mit new angefordert wird, sind auch wieder alle Iteratoren ungültig.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1581634</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1581634</guid><dc:creator><![CDATA[Bulli]]></dc:creator><pubDate>Sun, 14 Sep 2008 09:47:34 GMT</pubDate></item><item><title><![CDATA[Reply to std::map-Iterator wird ungültig on Sun, 14 Sep 2008 14:00:18 GMT]]></title><description><![CDATA[<p>Bulli schrieb:</p>
<blockquote>
<p>Generell sind Interatoren der Container nicht lange gültig. [...] Erst Recht wenn Du noch ein Element in den Container reinschmeisst, und erst Recht bei map.</p>
</blockquote>
<p>Wieso erst Recht bei <code>std::map</code> ? Die Map ist ein Binärbaum, und die Iteratoren, Referenzen und Zeiger auf die einzelnen Elemente sollten eigentlich erhalten bleiben. Gleiches gilt z.B. für den sequenziellen Container <code>std::list</code> .</p>
<p>Bei sequenziellen Containern sieht man aber auch, dass die Operationen <code>insert()</code> und <code>erase()</code> einen Iterator zurückgeben, um eine Iteration lückenlos zu schliessen. Bei assoziativen haben diese Methoden den Rückgabetypen <code>void</code> , wie sollte man also bei einer Durchiteration nach dem Löschen eines Elements reibungsfrei fortfahren können, wenn nicht die alten Iteratoren noch gültig wären?</p>
<p>Bulli schrieb:</p>
<blockquote>
<p>Muß noch sagen, das das auch nicht ganz richtig ist: sobald natürlich intern ein neues Array mit new angefordert wird, sind auch wieder alle Iteratoren ungültig.</p>
</blockquote>
<p>Wobei das auch nur geschieht, wenn die aktuelle Kapazität überschritten wird, was man mit <code>capacity()</code> abfangen kann.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1581738</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1581738</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Sun, 14 Sep 2008 14:00:18 GMT</pubDate></item><item><title><![CDATA[Reply to std::map-Iterator wird ungültig on Sun, 14 Sep 2008 19:42:35 GMT]]></title><description><![CDATA[<p>Map ist ein sortierter Container, der stest sortiert ist. Wenn du jetzt einen Wert einfügst, dann wird der auch wieder sortiert und daher können die Iteratoren nicht mehr gültig sein.</p>
<p>Eine Map kannst du, wie üblich durch die Angabe eines Iterator, oder eines Bereiches angeben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1581911</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1581911</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Sun, 14 Sep 2008 19:42:35 GMT</pubDate></item><item><title><![CDATA[Reply to std::map-Iterator wird ungültig on Sun, 14 Sep 2008 21:37:59 GMT]]></title><description><![CDATA[<p>drakon schrieb:</p>
<blockquote>
<p>Map ist ein sortierter Container, der stest sortiert ist. Wenn du jetzt einen Wert einfügst, dann wird der auch wieder sortiert und daher können die Iteratoren nicht mehr gültig sein.</p>
</blockquote>
<p>Ja, aber es ist kein linearer Speicher. Es ist nicht so, dass Map eigentlich ein Array ist, das nach jeder Einfügung ständig sortiert wird. Vielmehr wird gerade geschaut, wo ein Element einzufügen ist, was auch zum Vorteil für Hashmapping wird.</p>
<p>Die einzelnen Iteratoren werden wohl Zeiger auf die Elemente besitzen. Weil eine Map normalerweise mit einem Binärbaum implementiert ist, müssen bei Einfügungen und Löschungen wie bei einer Liste Zeiger neu verknüpft werden (eben für die Baumstruktur). Die einzelnen Elemente werden ja nicht verschoben, deshalb ist auch kein <code>operator=</code> für Objekte in assoziativen Containern notwendig. Und deswegen bleiben auch Iteratoren, Zeiger und Referenzen auf die Objekte gültig.</p>
<p>Steht übrigens auch im <a href="http://www.c-plusplus.net/forum/viewtopic-var-t-is-143816.html" rel="nofollow">STL-Artikel</a> (siehe zusammenfassende Tabelle unter Punkt 6).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1581931</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1581931</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Sun, 14 Sep 2008 21:37:59 GMT</pubDate></item><item><title><![CDATA[Reply to std::map-Iterator wird ungültig on Mon, 15 Sep 2008 10:50:18 GMT]]></title><description><![CDATA[<p>Ich kann den Fehler partout nicht finden, sagt jemand folgendes Meldung etwas:</p>
<p><a href="http://www.abload.de/img/crashqol.png" rel="nofollow">http://www.abload.de/img/crashqol.png</a></p>
<p>Würde vlt schon weiterhelfen wenn ich die Fehlermeldung deuten könnte <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title=":("
      alt="😞"
    /></p>
<p>Klicke ich auf &quot;Wiederholen&quot; lande ich hier</p>
<p><a href="http://www.abload.de/img/iterqz2.png" rel="nofollow">http://www.abload.de/img/iterqz2.png</a></p>
<p>bei &quot;map/set iterators incompatible&quot;</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1582083</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1582083</guid><dc:creator><![CDATA[mapper2000]]></dc:creator><pubDate>Mon, 15 Sep 2008 10:50:18 GMT</pubDate></item><item><title><![CDATA[Reply to std::map-Iterator wird ungültig on Mon, 15 Sep 2008 11:29:03 GMT]]></title><description><![CDATA[<p>mapper2000 schrieb:</p>
<blockquote>
<p>Würde vlt schon weiterhelfen wenn ich die Fehlermeldung deuten könnte <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title=":("
      alt="😞"
    /></p>
</blockquote>
<p>Würde evtl. schon reichen, es nur vom Englischen ins Deutsche zu übersetzen. Offensichtlich verwechselst du irgendwo Iteratoren von <code>std::map</code> mit solchen von <code>std::set</code> , daher kommt die Inkompatibilität. In deinem Code kann ich allerdings nichts dergleichen entdecken, sodass der Fehler womöglich woanders liegt.</p>
<p>Geh doch im Debugger bei der Assertion einfach den Stapelrahmen durch, bis du zu der Stelle gelangst, wo sich der Fehler in deinem Code befindet.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1582103</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1582103</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Mon, 15 Sep 2008 11:29:03 GMT</pubDate></item><item><title><![CDATA[Reply to std::map-Iterator wird ungültig on Mon, 15 Sep 2008 11:34:18 GMT]]></title><description><![CDATA[<p>Wird von verschiedenen Threads her auf die Map zugegriffen?<br />
Simon</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1582104</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1582104</guid><dc:creator><![CDATA[simon.gysi]]></dc:creator><pubDate>Mon, 15 Sep 2008 11:34:18 GMT</pubDate></item><item><title><![CDATA[Reply to std::map-Iterator wird ungültig on Mon, 15 Sep 2008 11:38:42 GMT]]></title><description><![CDATA[<p>Dann geh doch im Debugger in die Aufrufliste, sobald der Fehler auftritt, und suche dort die letzte Zeile aus Deinem Sourcecode auf. Dort kannst Du dann nachschauen, was der Iterator enthält. Vielleicht hoilft das bei der Fehlersuche weiter.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1582105</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1582105</guid><dc:creator><![CDATA[jencas]]></dc:creator><pubDate>Mon, 15 Sep 2008 11:38:42 GMT</pubDate></item><item><title><![CDATA[Reply to std::map-Iterator wird ungültig on Mon, 15 Sep 2008 11:42:15 GMT]]></title><description><![CDATA[<p>Nexus schrieb:</p>
<blockquote>
<p>mapper2000 schrieb:</p>
<blockquote>
<p>Würde vlt schon weiterhelfen wenn ich die Fehlermeldung deuten könnte <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title=":("
      alt="😞"
    /></p>
</blockquote>
<p>Würde evtl. schon reichen, es nur vom Englischen ins Deutsche zu übersetzen. Offensichtlich verwechselst du irgendwo Iteratoren von <code>std::map</code> mit solchen von <code>std::set</code> , daher kommt die Inkompatibilität.</p>
</blockquote>
<p>Die Fehlermeldung ist nicht dahingehend zu verstehen, dass hier zwingend map- und set-Ietratoren durchmischt wurden. Intern basieren Iteratoren für sets und maps auf der gleichen Baumstruktur, und der gezeigte Code kann an dieser Stelle nicht entscheiden, ob der Iterator nun zu einem set oder einer map gehört. Die Fehlermeldung besagt also, dass die betreffenden Iteratoren inkompatibel - als wahrscheinlich ungültig - sind und jeder für sich zu einem set oder einer map gehören würde.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1582107</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1582107</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Mon, 15 Sep 2008 11:42:15 GMT</pubDate></item></channel></rss>