<?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[map iterator prüfen ob er größer als das ende der map ist]]></title><description><![CDATA[<p>Hallo.</p>
<p>Ich habe eine Map in der diverse Daten gehalten werden. Weiterhin hab ich eine Funktion getNext(int *key); die mir immer den nächsten Key in der Map ausgibt. Der Iterator it wird in einer anderen Funktion erzeugt.</p>
<pre><code>bool getNext(int* key) {
	try {
		if (it == values.end()) {
			SetLastError(ERROR_NO_MORE_ITEMS);
			return false;
		}
		*key = it-&gt;first;
		it++;
	} catch (...) {
		return false;
	}
	return true;
}
</code></pre>
<p>Nun möchte ich so lange getNext aufrufen, bis mir das letzte Element ausgegeben wurde. Beim darauf folgenden Ausruf soll dann erst &quot;FALSE&quot; zurückgegeben werden und SetLastError soll einen Fehler setzen. Das passiert auch so weit. Nur hab ich nun noch das Problem, dass mir die Funktion schon bei dem letzten Element in der Liste diesen Fehler ausgibt. Das macht auch Sinn, denn</p>
<pre><code>if (it == values.end())
</code></pre>
<p>prüft ja genau da drauf. Nur möchte ich genau dieses Element noch ausgeben.</p>
<p>Ein</p>
<pre><code>if (it &gt; values.end())
</code></pre>
<p>wird mir vom Compiler angemotzt, Operator nicht verfügbar...</p>
<p>Wie würdet ihr denn das Problem lösen?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/233544/map-iterator-prüfen-ob-er-größer-als-das-ende-der-map-ist</link><generator>RSS for Node</generator><lastBuildDate>Thu, 24 Sep 2026 20:24:17 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/233544.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 05 Feb 2009 17:24:42 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to map iterator prüfen ob er größer als das ende der map ist on Thu, 05 Feb 2009 17:25:14 GMT]]></title><description><![CDATA[<p>Hallo.</p>
<p>Ich habe eine Map in der diverse Daten gehalten werden. Weiterhin hab ich eine Funktion getNext(int *key); die mir immer den nächsten Key in der Map ausgibt. Der Iterator it wird in einer anderen Funktion erzeugt.</p>
<pre><code>bool getNext(int* key) {
	try {
		if (it == values.end()) {
			SetLastError(ERROR_NO_MORE_ITEMS);
			return false;
		}
		*key = it-&gt;first;
		it++;
	} catch (...) {
		return false;
	}
	return true;
}
</code></pre>
<p>Nun möchte ich so lange getNext aufrufen, bis mir das letzte Element ausgegeben wurde. Beim darauf folgenden Ausruf soll dann erst &quot;FALSE&quot; zurückgegeben werden und SetLastError soll einen Fehler setzen. Das passiert auch so weit. Nur hab ich nun noch das Problem, dass mir die Funktion schon bei dem letzten Element in der Liste diesen Fehler ausgibt. Das macht auch Sinn, denn</p>
<pre><code>if (it == values.end())
</code></pre>
<p>prüft ja genau da drauf. Nur möchte ich genau dieses Element noch ausgeben.</p>
<p>Ein</p>
<pre><code>if (it &gt; values.end())
</code></pre>
<p>wird mir vom Compiler angemotzt, Operator nicht verfügbar...</p>
<p>Wie würdet ihr denn das Problem lösen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1658644</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1658644</guid><dc:creator><![CDATA[daimonion]]></dc:creator><pubDate>Thu, 05 Feb 2009 17:25:14 GMT</pubDate></item><item><title><![CDATA[Reply to map iterator prüfen ob er größer als das ende der map ist on Thu, 05 Feb 2009 17:30:55 GMT]]></title><description><![CDATA[<p>Normalerweise zeigt end() auf eine Position eins hinter dem letzten Element.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1658647</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1658647</guid><dc:creator><![CDATA[Braunstein]]></dc:creator><pubDate>Thu, 05 Feb 2009 17:30:55 GMT</pubDate></item><item><title><![CDATA[Reply to map iterator prüfen ob er größer als das ende der map ist on Thu, 05 Feb 2009 17:32:02 GMT]]></title><description><![CDATA[<p><code>values.end()</code> ist kein Iterator auf das letzte Element, sondern schon einen Schritt weiter.</p>
<p>Zu deiner Frage: Iteratoren zu vergleichen, ergibt überhaupt nur dann Sinn, wenn die beiden Iteratoren in dieselbe Sequenz verweisen. Mit einem Iterator außerhalb der Map zu vergleichen kann also nicht funktionieren (mit dem end-Iterator allerdings schon, der gehört noch dazu)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1658648</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1658648</guid><dc:creator><![CDATA[Bashar]]></dc:creator><pubDate>Thu, 05 Feb 2009 17:32:02 GMT</pubDate></item><item><title><![CDATA[Reply to map iterator prüfen ob er größer als das ende der map ist on Thu, 05 Feb 2009 18:36:34 GMT]]></title><description><![CDATA[<p>Hmm, wenn end() schon auf das Element hinter dem letzten Element zeigt, dann sollte mein Code ja theoretisch funktionieren. Dann muß ich morgen nochmal genau schauen was da in dem code abgeht...</p>
<p>Danke für die Antworten</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1658671</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1658671</guid><dc:creator><![CDATA[daimonion]]></dc:creator><pubDate>Thu, 05 Feb 2009 18:36:34 GMT</pubDate></item><item><title><![CDATA[Reply to map iterator prüfen ob er größer als das ende der map ist on Fri, 06 Feb 2009 07:10:01 GMT]]></title><description><![CDATA[<p>Es gibt nicht für jeden Iteratortyp den größer/kleiner-Operator. Das hängt mit der Datenstruktur zusammen, über die iteriert wird. Bei einem vector liegt ein normales Array zugrunde, so dass die Iteratoren im Grunde normale Pointer sind, bei denen solche Vergleiche möglich sind. Bei einer Map handelt es sich aber um eine Baumstruktur, so dass man bei zwei Iteratoren auf zwei unterschiedliche Elemente nicht ohne größeren Aufwand feststellen kann welcher &quot;vor&quot; dem anderen ist. Die einzelnen Knoten des Baums können beliebig kompliziert im Speicher verteilt liegen. Aus dem Grund kann man bei der Map um genau zu sein auch nicht davon sprechen, dass end() hinter das letzte Element zeigt (es gibt eben kein &quot;dahinter&quot;). Es ist lediglich definiert, dass end() einen Iterator zurückgibt der dem entspricht, wenn man einen Iterator auf das letzte Element inkrementiert.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1658870</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1658870</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Fri, 06 Feb 2009 07:10:01 GMT</pubDate></item><item><title><![CDATA[Reply to map iterator prüfen ob er größer als das ende der map ist on Fri, 06 Feb 2009 09:32:00 GMT]]></title><description><![CDATA[<p>Macht durchaus Sinn.</p>
<p>Aber der Vergleich (it = values.end()) an sich funktioniert ja oder kann es da zu Problemen kommen? Also die Tests die ich jetzt gemacht haben, waren alle erfolgreich!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1658923</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1658923</guid><dc:creator><![CDATA[daimonion]]></dc:creator><pubDate>Fri, 06 Feb 2009 09:32:00 GMT</pubDate></item><item><title><![CDATA[Reply to map iterator prüfen ob er größer als das ende der map ist on Fri, 06 Feb 2009 10:45:29 GMT]]></title><description><![CDATA[<p>daimonion schrieb:</p>
<blockquote>
<p>(it = values.end()) an sich funktioniert ja oder kann es da zu Problemen kommen?</p>
</blockquote>
<p>Wenn du noch ein zweites '=' spendierst und aus der Zuweisung auch tatsächlich einen Vergleich machst dann sollte es eigentlich nicht zu Problemen kommen - vorausgesetzt du führst den Vergleich <em>vor jedem</em> Inkrement aus. Es gibt zwei Fehler die man hier immer wieder mal sieht:<br />
- In einer Schleife wird unter irgendwelchen wüsten Bedingungen gleich zweimal inkrementiert, ohne Zwischenchecks. Wenn der erste Inkrement den Iterator auf end() setzt, macht das Programm beim zweiten Inkrement die Grätsche. (deswegen <em>jedem</em> kursiv)<br />
- Jemand erstellt einen Container, macht eine optionale Befüllung (optional = der Contaier könnte danach trotzdem noch leer sein), setzt einen Iterator auf begin() und inkrementiert ihn vor dem ersten Check auf end(). Der Check wird nicht erreicht, denn wenn der Container wirklich leer geblieben ist, ist begin() == end(), und der erste Inkrement geht schon in die Hose. (deswegen <em>vor</em> kursiv)</p>
<p>Natürlich, wenn man den Container mit 100%iger Sicherheit nicht leer hat dann kann man das <em>vor</em> etwas aufweichen - genauso wie das <em>jedem</em> wenn man zu einem bestimmten Zeitpunkt sicher sein kann dass noch mehr als ein Inkrement möglich ist. Aber sicher ist sicher...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1658957</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1658957</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Fri, 06 Feb 2009 10:45:29 GMT</pubDate></item><item><title><![CDATA[Reply to map iterator prüfen ob er größer als das ende der map ist on Fri, 06 Feb 2009 17:08:43 GMT]]></title><description><![CDATA[<p>Oh, da ist mir wieder mal einer der üblichen Fehler unterlaufen.. Klar sollte das schon '==' sein. Ebenso ist mir natürlich klar, dass auch nur ein Inkrement ausgeführt werden soll und auch, dass die Map gefüllt sein sollte. Das stelle ich sicher!</p>
<p>Danke für eure Hilfe.</p>
<p>Grüße<br />
Daimonion</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1659178</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1659178</guid><dc:creator><![CDATA[daimonion]]></dc:creator><pubDate>Fri, 06 Feb 2009 17:08:43 GMT</pubDate></item><item><title><![CDATA[Reply to map iterator prüfen ob er größer als das ende der map ist on Fri, 06 Feb 2009 17:44:44 GMT]]></title><description><![CDATA[<p>pumuckl schrieb:</p>
<blockquote>
<p>Es gibt nicht für jeden Iteratortyp den größer/kleiner-Operator. Das hängt mit der Datenstruktur zusammen, über die iteriert wird.</p>
</blockquote>
<p>Man kann distance(i1, i2) nehmen, wenn man ohne Rücksicht auf Effizienz Iteratoren vergleichen will. Aber hier gilt auch, wie gesagt, dass beide in dieselbe Sequenz zeigen müssen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1659197</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1659197</guid><dc:creator><![CDATA[Bashar]]></dc:creator><pubDate>Fri, 06 Feb 2009 17:44:44 GMT</pubDate></item></channel></rss>